簡體   English   中英

更新或刪除違反外鍵約束

[英]Update or Delete Violates foreign key constraint

我有兩個表,如下所示。

CREATE TABLE book (
    book_id BIGSERIAL PRIMARY KEY,
    book_special_id character(10) NOT NULL DEFAULT random_string(10) UNIQUE,
    author_id bigint REFERENCES author(author_id) ON DELETE RESTRICT,
    category_id bigint REFERENCES category(category_id) ON DELETE RESTRICT,
    title text NOT NULL,
    subtitle text,
    book_text text
);

CREATE TABLE booksubcategory (
    booksubcategory_id BIGSERIAL PRIMARY KEY,
    book_id BIGSERIAL REFERENCES book(book_id) ON DELETE CASCADE,
    subcategory_id BIGSERIAL REFERENCES subcategory(subcategory_id) ON DELETE RESTRICT,
    CONSTRAINT booksubcategory_book_id_subcategory_id_key UNIQUE (book_id, subcategory_id)
);

在此示例中,book_id列是book表中的主鍵,而在booksubcategory表中是引用的外鍵。 當我嘗試運行以下sql時,收到錯誤消息:

ERROR: update or delete on table "book" violates foreign key constraint "booksubcategory_book_id_fkey" on table "booksubcategory"
Detail: Key (book_id)=(888392) is still referenced from table "booksubcategory"

這是SQL的樣子。

INSERT INTO book (book_special_id, author_id, category_id, title, subtitle, book_text) 
VALUES ("D4jOko2IP0",34, 4, "Book Example", "Book Subtitle", "Some lengthy text") 
ON CONFLICT (book_special_id) 
DO UPDATE SET author_id=EXCLUDED.author_id, book_id=EXCLUDED.book_id,  category_id=EXCLUDED.category_id, title=EXCLUDED.title, subtitle=EXCLUDED.subtitle, book_text=EXCLUDED.book_text;

在這種情況下,sql應該更新列,因為book表中已經存在book_special_key

我很熟悉為什么出於完整性原因對外鍵約束進行更新和刪除會失敗的原因,但是在我的情況下,我不是直接更新book_id,而只是直接更新book表中的列。 另外,我在子表的外鍵上設置了ON DELETE CASCADE 有人可以告訴我為什么我遇到這個問題嗎?

插入的行與唯一鍵special_book_id發生沖突,然后沖突規則嘗試更新重復的行。

但是由於沖突而尚未插入的新行的值book_id是autogen嗎? 好吧,可以是null或新的序列號。

因此,無論哪種情況,您都將book_id更新為null或新的序列,並且由於舊的book_id值(即將消失)具有引用而失敗。

刪除對book_id列的更新,它應該可以工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM