如果我有一个表的外键约束,删除整个表时是否需要小心?

时间:2012-10-29 18:16:08

标签: sqlite foreign-keys referential-integrity

我有一个SQLite表,如下所示:

CREATE TABLE myTable (
    _id integer primary key autoincrement,
    ...
    ... /* some useful fields */
    ...
    parent integer,
    FOREIGN KEY (parent) REFERENCES myTable (_id)
);

myTable中的某些条目有父母,有些则没有。业务逻辑确保没有“圈子”。我正在使用PRAGMA foreign_keys = ON,以便检测到外键冲突。

问题:如果我要删除整个表格,是否足以执行DELETE FROM myTable或者我是否需要首先删除“离开”,然后删除父母等等。 ,一路避免外键违规?

我已对其进行了测试,仅使用DELETE FROM myTable 似乎可以正常工作。但是,我想知道这只是巧合还是我可以依赖的东西(即记录和预期的行为)。


编辑:我没有启用ON DELETE CASCADE,这是故意的。

1 个答案:

答案 0 :(得分:0)

插入

通过指定foreign keyPRAGMA foreign_keys = ON,从空表开始,SQLite将拒绝任何数据输入(除了身份,parent = _id}以及消息:

  

错误:外键约束失败。

因此,从一开始,您需要至少使用PRAGMA foreign_keys = OFF或"循环"条目。

删除特定条目

如果您未向action提供foreign key CASCADE,则SQLite将拒绝删除"父条目"如果父母由于外键约束而有孩子。这是默认行为,相当于" NO ACTION"。

删除所有条目

可以通过DELETE FROM myTable删除所有条目,并且不应在同一个表上触发外键约束,即使没有cascade子句也是如此。我通过测试验证,可能没有记录。