我已经设置了两个表:
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)
);
将数据插入A
后,它看起来像这样:
1 John
2 Amy
3 Peter
将数据插入B
后,它看起来像这样:
1 1 Lord of the Rings
2 1 Catch 22
3 2 Sum of All Fears
4 3 Hunt for Red October
然后我执行以下语句:
delete from a where id=1;
我得到以下内容:"Error: foreign key constraint failed"
然后我重新启动sqlite3
并重试,但这次我先输入:
PRAGMA foreign_keys = 1;
它仍然不起作用......
答案 0 :(得分:12)
Table B
的行的外键引用了您要删除的Table A
行的主键值,因此删除它会违反数据库的完整性。
您可以在外键定义中包含ON DELETE CASCADE
。这样,当您从Table A
删除条目时,链接到已删除行的Table B
中的所有条目也将被删除。不知道这是否适合您的申请。
答案 1 :(得分:5)
“问题”是您在表B上设置了外键。
foreign key(id2) references A(id)
这意味着表B中的列id2
引用了表A中的列id
。来自Lord of the Rings
的{{1}}和Catch 22
都与{{1}相关联来自Table B
。因此,如果不首先从John
删除其他两个条目,则无法删除Table A
。
替代方法是删除外键。
有关详细信息,请参阅this文档。