sqLite ON DELETE CASCADE无法在Android上运行

时间:2016-12-05 14:18:28

标签: android database sqlite mobile

我有两个表级和翻译。在级别表中,存在对翻译的外键约束。 sql语句看起来像这样

Translation table:
CREATE TABLE Translation(idTranslation INTEGER PRIMARY KEY AUTOINCREMENT, de TEXT NOT NULL,frTEXT NOT NULL);

Level table:
CREATE TABLE Level (idLevel INTEGER PRIMARY KEY, fkTranslation INTEGER NOT NULL, status INTEGER NOT NULL,FOREIGN KEY (fkTranslation) REFERENCES Translation ( idTranslation ) ON DELETE CASCADE);

但是现在当我试图删除条目级别时,相应的翻译条目不会被删除!

不,我没有忘记把

db.execSQL("PRAGMA foreign_keys=ON;");
onOpen()上的

在我用

检查的删除命令之前
db.execSQL("PRAGMA foreign_keys;");

如果它返回并返回1,那么它是活动的。

有谁知道我可以测试什么或我在哪里犯了错误?我已经测试了很多东西,我不知道错误可能在哪里。

先谢谢你

1 个答案:

答案 0 :(得分:1)

当尝试删除通过外键约束引用的记录时,级联用于防止数据库抛出引用约束错误。

在您的情况下,删除级别记录不会产生这种情况。它只会删除引用记录,但不会删除正在引用的记录。

它反过来工作。如果删除翻译记录,相应的级别记录将级联,即删除,否则,它将引用不再存在的翻译记录。

如果它能像您期望的那样工作,那就毫无意义了。例如,假设我有一个Customer表和一个Order表。订单必须引用客户。如果客户被删除,那么删除订单也是有意义的,因为我不能拥有不引用客户的订单。但是,如果删除订单,则删除客户是没有意义的。让客户没有订单是数据库完全有效的状态。