Sql 更新或删除违反外键约束

Sql 更新或删除违反外键约束,sql,postgresql,Sql,Postgresql,我有两张像下面这样的桌子 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 c

我有两张像下面这样的桌子

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\u special\u键


我很熟悉外键约束的更新和删除会因为完整性原因而失败的原因,但在我的例子中,我不是直接更新book_id,而是更新book表中的列。我还在子表中的外键上设置了关于删除级联的
。有人能告诉我为什么会遇到此问题吗?

插入的行与唯一键special\u book\u id冲突,然后冲突规则尝试更新重复的行

但是,由于冲突而尚未插入且为autogen的新行的值帐簿id是多少?嗯,要么是空的,要么是新的序列号

因此,不管是哪种情况,您都要将book_id更新为null或一个新的序列号,但由于正在消失的旧book_id值具有引用,因此更新失败


删除对列book\u id的更新,它应该可以工作。

您的更新会更改行的主键-显然是一个新值,但旧值仍然从booksubcategory表中引用。哦,我明白了。我忘了拆下那条线。我找了好几个小时,这只是一个简单的错误。谢谢你指出这一点。