【问题标题】:FOREIGN KEY constraint fails even though foreign_keys is ON即使 foreign_keys 为 ON,FOREIGN KEY 约束也会失败
【发布时间】:2020-09-29 17:44:38
【问题描述】:

在使用 Python 3 和 SQLite3 时,在执行 cursor.execute("DELETE FROM my_table WHERE my_column IS NULL;") 时,出现错误

sqlite3.IntegrityError: FOREIGN KEY constraint failed

即使我在那之前做过connection.execute("PRAGMA foreign_keys = ON;")。不将foreign_keys 设置为ON 保证其他表中具有引用my_table 中已删除行的外键列的行也将被删除,从而防止此错误发生,或者我误解了该函数PRAGMA foreign_keys?

【问题讨论】:

    标签: python sqlite foreign-keys


    【解决方案1】:

    您是否使用ON DELETE CASCADE 操作定义了引用my_table 中列的其他表中的列,例如:

    columnInOtherTable INTEGER REFERENCES my_table(columnInMyTable) ON DELETE CASCADE
    

    如果是,那么您的代码应该可以工作,除非下面还有与级联删除相关的其他级别。

    如果不是,那么你应该这样做。
    强制删除引用行的是 ON DELETE CASCADE 操作。

    当然PRAGMA foreign_keys 必须是ON

    【讨论】:

    • 啊,可能是这样!不,我没有那样做。我是否可以以某种方式手动删除所有本来会被手动删除的行,而无需手动检查其他表中的每一行它们在my_table 中链接到的行是否为NULL?这是可行的,但对我来说似乎很慢,因为它需要一个 DELETE FROM 命令来删除其他表中的每一行。
    • 为什么你希望链接的列有 NULL 值?
    • 不是链接列有NULL值,而是另一列,没有其他表引用。我已经在表中添加了许多行之后创建了这些列,现在我想删除旧行。
    • 您可以这样做:DELETE FROM othertable WHERE columnInOtherTable = ?,将?替换为已删除行中引用列的值。或者:DELETE FROM othertable WHERE othercolumn is null AND .... 如果你想使用那个 NULL 列。
    • 恐怕没那么简单;在我想级联删除操作的另一个表的列中,我只有一堆 id 编号,它们引用my_table 中的id 列,并且一般没有简单的方法可以从 id 编号中分辨出来my_column 为 NULL 并且该行将被删除。或者在这种情况下实际上是这样,因为将被删除的行是 id 值低于第一行的 id 的行,其中my_column 不为 NULL,但是假设该表的排序不是很好;那么它还有可能以某种方式吗?
    猜你喜欢
    • 2020-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-01
    • 2018-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多