sqlite3"外键约束失败"

A B*_*A B 11 sqlite foreign-keys

我已经设置了两个表:

CREATE TABLE A
(
    id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    name TEXT
 );

CREATE TABLE B
(
    id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    id2 INTEGER,
    book TEXT,
    FOREIGN KEY(id2) REFERENCES A(id)
);
Run Code Online (Sandbox Code Playgroud)

插入数据后A,它看起来像这样:

1    John

2    Amy

3    Peter
Run Code Online (Sandbox Code Playgroud)

插入数据后B,它看起来像这样:

1     1     Lord of the Rings

2     1     Catch 22

3     2     Sum of All Fears

4     3     Hunt for Red October
Run Code Online (Sandbox Code Playgroud)

然后我执行以下语句:

delete from a where id=1;
Run Code Online (Sandbox Code Playgroud)

我得到以下内容: "Error: foreign key constraint failed"

然后我重新启动并重sqlite3试,但这次我先输入:

PRAGMA foreign_keys = 1;
Run Code Online (Sandbox Code Playgroud)

它仍然无法正常工作......

小智 13

Table B具有其外键引用Table A您尝试删除的行的主键值的行,因此删除它将违反数据库的完整性.

您可以包含ON DELETE CASCADE在外键定义中.这样,当您从中删除Table A条目时,Table B链接到已删除行的任何条目也将被删除.不知道这是否适合您的申请.


Kyl*_*yle 6

"问题"是你在表B上设置了一个外键.

foreign key(id2) references A(id)
Run Code Online (Sandbox Code Playgroud)

这意味着id2表B中的列引用id表A中的列.Both Lord of the RingsCatch 22from Table B都链接到Johnfrom Table A.因此,如果John不首先删除这两个条目,则无法删除Table B.

另一种方法是删除外键.

有关详细信息,请参阅文档.

  • 出于某种原因,我有一种印象,这应该会自动发生。这不是CASCADE设置的用途吗? (4认同)