【问题标题】:sqlite3 "foreign key constraint failed"sqlite3“外键约束失败”
【发布时间】:2013-03-04 20:19:24
【问题描述】:

我已经设置了两个表:

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;

还是不行……

【问题讨论】:

  • 设置 PRAGMA foreign_keys = 1 实际上会强制执行外键约束。我的印象是您正在尝试禁用它,这意味着您应该将其设置为 0 而不是 1
  • 不要删除东西,将它们标记为“死”。 stackoverflow.com/questions/502501/…

标签: sqlite foreign-keys


【解决方案1】:

Table B 的行的外键引用了您尝试删除的 Table A 行的主键值,因此删除它会破坏数据库的完整性。

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

【讨论】:

    【解决方案2】:

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

    foreign key(id2) references A(id)
    

    这意味着表 B 中的列 id2 引用表 A 中的列 id。来自 Table BLord of the RingsCatch 22 都链接到来自 Table AJohn。因此,如果不先从 Table B 中删除这两个条目,则无法删除 John

    替代方法是删除外键。

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

    【讨论】:

    • 出于某种原因,我觉得这应该自动发生。这不就是 CASCADE 设置的用途吗?
    猜你喜欢
    • 2016-11-08
    • 1970-01-01
    • 2018-09-11
    • 2013-05-29
    • 1970-01-01
    • 2019-10-26
    • 1970-01-01
    • 2013-01-20
    • 2016-08-17
    相关资源
    最近更新 更多