我有一个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
,这是故意的。
答案 0 :(得分:0)
通过指定foreign key和PRAGMA foreign_keys = ON
,从空表开始,SQLite将拒绝任何数据输入(除了身份,parent = _id
}以及消息:
错误:外键约束失败。
因此,从一开始,您需要至少使用PRAGMA foreign_keys = OFF
或"循环"条目。
如果您未向action提供foreign key CASCADE
,则SQLite将拒绝删除"父条目"如果父母由于外键约束而有孩子。这是默认行为,相当于" NO ACTION"。
可以通过DELETE FROM myTable
删除所有条目,并且不应在同一个表上触发外键约束,即使没有cascade子句也是如此。我通过测试验证,可能没有记录。