在级联上删除,错误FOREIGN KEY约束失败,sqlite

时间:2016-08-18 17:46:31

标签: android foreign-keys android-sqlite

当我删除聊天行时,我想删除使用该id_chat创建的所有消息行和所有关系行。此时我没有添加寄存器的问题,但删除了关系和消息寄存器,因为它们不会自动消失。

public class DatabaseHelper extends SQLiteOpenHelper {
    @Override
    public void onCreate(SQLiteDatabase db) {
         db.execSQL("CREATE TABLE Chats (_id INTEGER PRIMARY KEY AUTOINCREMENT, A1 DATE)");
         db.execSQL("CREATE TABLE Messages (_id INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(id_user) REFERENCES Users(id_user), FOREIGN KEY(id_chat) REFERENCES Chats(_id) ON DELETE CASCADE)");
         db.execSQL("CREATE TABLE Relations (id_viaje INTEGER, id_chat INTEGER, PRIMARY KEY (id_chat, id_viaje), FOREIGN KEY (id_chat) REFERENCES Chats(_id) ON DELETE CASCADE, FOREIGN KEY (id_viaje) REFERENCES Viajes(_id))");
         db.execSQL("CREATE TABLE Users (_id INTEGER AUTO_INCREMENT, id_user TEXT PRIMARY KEY, name TEXT)");
         db.execSQL("CREATE TABLE Viajes (_id INTEGER PRIMARY KEY AUTOINCREMENT, date DATE, activate BOOLEAN, id_user TEXT not null)");
     }
}

因此,当我在stackoverflow中读取时,我覆盖方法onOpen以激活外键:

public void onOpen(SQLiteDatabase db){
    super.onOpen(db);
    db.execSQL("PRAGMA foreign_keys = ON");
}

编辑: 现在添加了关系中的第一个寄存器(1,17),第二个(3,17)在本地数据库中给出了一个错误:

Error inserting id_viaje=3 id_chat=17 android.database.sqlite.SQLiteConstraintException: FOREIGN KEY constraint failed

为什么会出现这个错误?如何在级联上删除? 感谢

2 个答案:

答案 0 :(得分:0)

Chats没有名为id_chat

的列

因此表Relations中的外键声明无效:

FOREIGN KEY (id_chat)  REFERENCES Chats(id_chat) ON DELETE CASCADE
                                        ^^^^^^^ 

这个问题用“mysql”标记,但看起来你实际上是在使用SQLite而不是MySQL。两者之间存在一些差异。例如,PRAGMA foreign keys在MySQL中无效。

答案 1 :(得分:0)

我的解决方案是将id_viaje作为表关系中的外键删除。只是:

db.execSQL("CREATE TABLE Relations (id_viaje INTEGER, id_chat INTEGER, PRIMARY KEY (id_chat, id_viaje), FOREIGN KEY (id_chat) REFERENCES Chats(_id) ON DELETE CASCADE)");

约束异常消失了,并且在级联上删除了。

不确定为什么会发生这种情况,因为id_viaje和id_chat都是我服务器中的外键,在添加或删除寄存器时我没有任何问题。