Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sqlite 如果表本身有外键约束,那么在删除整个表时是否需要小心?_Sqlite_Foreign Keys_Referential Integrity - Fatal编程技术网

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

我有一个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,以便检测外键冲突

问题:如果我想删除整个表,从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的新行。重新删除:感谢您的测试;我会留下这个问题,以防有人发现这是我正在寻找的任何文件。