1

我有一个如下所示的 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启用,这是故意的。

4

1 回答 1

0

插入

通过指定外键和 with PRAGMA foreign_keys = ON,从空表开始,SQLite 将拒绝您输入任何数据(身份除外,其中parent = _id)并显示以下消息:

错误:外键约束失败。

因此,从一开始,您需要至少创建一个带有PRAGMA foreign_keys = OFF或“圆形”条目的条目。

删除特定条目

如果您不提供诸如外键之类的操作,则如果父项由于外键约束而有子项,SQLite 将拒绝删除“父项”。这是默认行为,相当于“NO ACTION”。CASCADE

删除所有条目

DELETE FROM myTable即使没有级联子句,也可以通过并且不应该触发同一张表上的外键约束来删除所有条目。我通过测试验证,它可能没有记录。

于 2012-10-30T00:36:38.017 回答