Sqlite 如果表本身有外键约束,那么在删除整个表时是否需要小心?
我有一个SQLite表,如下所示:Sqlite 如果表本身有外键约束,那么在删除整个表时是否需要小心?,sqlite,foreign-keys,referential-integrity,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中的某些项有父项,其他项没有父项。业务逻辑确保没有循环。我使用PRAGM
CREATE TABLE myTable (
_id integer primary key autoincrement,
...
... /* some useful fields */
...
parent integer,
FOREIGN KEY (parent) REFERENCES myTable (_id)
);
myTable中的某些项有父项,其他项没有父项。业务逻辑确保没有循环。我使用PRAGMA foreign_keys=ON,以便检测外键冲突
问题:如果我想删除整个表,从myTable执行delete是否足够?还是我需要先删除叶子,然后删除它们的父母等等,以避免外键违规
我已经测试过了,使用JustDeletefromMyTable似乎很有效。然而,我想知道这是巧合还是我可以依赖的东西,即记录和预期的行为
编辑:我没有启用ON DELETE CASCADE,这是故意的。Insert
通过使用PRAGMA foreign_keys=ON指定and,从空表开始,SQLite将拒绝您输入除标识之外的任何数据项,其中parent=\u id包含以下消息:
错误:外键约束失败
因此,从一开始,您至少需要创建一个PRAGMA foreign_keys=OFF的条目或循环条目
删除特定条目
如果您不向您的提供诸如级联之类的,则如果父项由于外键约束而具有子项,SQLite将拒绝删除父项。这是默认行为,相当于不执行任何操作
删除所有条目
可以通过从myTable中删除来删除所有条目,即使没有cascade子句,也不应触发同一个表上的外键约束。我通过测试进行了验证,它可能没有文档记录。Bah,我无法正确获取它!如果还没有回答的话,也许今晚就可以了。这是你的第一点:因为parent可以为NULL,所以即使PRAGMA foreign_keys=ON,也可以添加parent=NULL的新行。重新删除:感谢您的测试;我会留下这个问题,以防有人发现这是我正在寻找的任何文件。