2013-03-15 104 views
3

我已经成立了两个表:sqlite3的“外键约束失败”

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

设置'PRAGMA foreign_keys = 1'实际上强制执行外键约束。我得到的印象是你试图禁用它,这意味着你应该将它设置为0而不是1 – goonerify 2017-06-12 09:35:34

+0

不要删除东西,将它们标记为“已死”。 https://stackoverflow.com/questions/502501/database-to-delete-or-not-to-delete-records – 2017-07-09 14:00:11

回答

3

“问题”是你在表B上设置了外键。

foreign key(id2) references A(id) 

这意味着在表B中的引用列id在表A.该列id2两者Lord of the RingsCatch 22Table B被链接到JohnTable A。因此,如果没有先从Table B中删除这些其他两个条目,则无法删除John

另一种方法是删除外键。

有关更多详细信息,请参见this文档。

6

Table B有外键的行,其外键引用您试图删除的行的主键值,因此删除它会违反数据库的完整性。

您可以在您的外键定义中包含ON DELETE CASCADE。因此,当您从Table A删除条目时,连接到删除行的Table B中的任何条目也将被删除。不知道这是否适合您的应用程序。