Android 如果存在子项,如何停止父项删除

Android 如果存在子项,如何停止父项删除,android,sqlite,Android,Sqlite,我想在SQLite中使用约束 场景:如果存在子项,则停止父项删除 我怎样才能做到这一点呢?假设您有表A(ID,名称)和表B(ID,A\U ID,NICK\U名称) 当您创建表A时 create table A ( ID INTEGER PRIMARY KEY, NAME TEXT NOT NULL UNIQUE ); create table B ( ID INTEGER PRIMARY KEY, A_ID INTEGER NOT NULL, NICK_

我想在SQLite中使用约束

场景:如果存在子项,则停止父项删除

我怎样才能做到这一点呢?

假设您有表A(ID,名称)和表B(ID,A\U ID,NICK\U名称)

当您创建表A时

create table A (
    ID INTEGER PRIMARY KEY,
    NAME TEXT NOT NULL UNIQUE
);

create table B (
    ID INTEGER PRIMARY KEY,
    A_ID INTEGER NOT NULL,
    NICK_NAME TEXT,
    CONSTRAINT A_FK FOREIGN KEY (A_ID) REFERENCES A (ID) ON DELETE RESTRICT
);
如果尝试从表A中删除列B引用的内容,则会导致错误

编辑:正如原始海报的评论和我自己的评论所指出的,这显然不起作用。其他人对此有何解释?

假设您有表A(ID,名称)和表B(ID,A\U ID,NICK\U名称)

当您创建表A时

create table A (
    ID INTEGER PRIMARY KEY,
    NAME TEXT NOT NULL UNIQUE
);

create table B (
    ID INTEGER PRIMARY KEY,
    A_ID INTEGER NOT NULL,
    NICK_NAME TEXT,
    CONSTRAINT A_FK FOREIGN KEY (A_ID) REFERENCES A (ID) ON DELETE RESTRICT
);
如果尝试从表A中删除列B引用的内容,则会导致错误


编辑:正如原始海报的评论和我自己的评论所指出的,这显然不起作用。其他人对此有所了解吗?

更正:SQLite支持外键约束,但默认情况下它们是关闭的。您必须使用此语句在运行时启用它们。(这意味着您不能设置一次,并期望它保持不变。如果您忘记只设置一次,则可以从父表中删除行,并在子表中留下孤立项。)

详情载于


可以在完全禁用外键支持的情况下编译SQLite。这是需要记住的。

更正:SQLite支持外键约束,但默认情况下它们是关闭的。您必须使用此语句在运行时启用它们。(这意味着您不能设置一次,并期望它保持不变。如果您忘记只设置一次,则可以从父表中删除行,并在子表中留下孤立项。)

详情载于


可以在完全禁用外键支持的情况下编译SQLite。这是需要记住的。

应该记住,但在SQLite中没有。SQLite接受外键声明,但忽略它们。您必须在SQLite中使用触发器实现逻辑外键约束。非常有趣。我试过我自己的例子。。。哇!SQLite 3表示它支持这一点,但显然它没有启用。是的,我发现了同样的东西。细节在我的回答中。如果不启用外键支持,还可以在父表中插入不包含任何行的子表。这是有道理的,以一种非常扭曲的方式。它应该是,但在SQLite中不是。SQLite接受外键声明,但忽略它们。您必须在SQLite中使用触发器实现逻辑外键约束。非常有趣。我试过我自己的例子。。。哇!SQLite 3表示它支持这一点,但显然它没有启用。是的,我发现了同样的东西。细节在我的回答中。如果不启用外键支持,还可以在父表中插入不包含任何行的子表。这是有道理的,以一种非常扭曲的方式。