当我删除聊天行时,我想删除使用该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
为什么会出现这个错误?如何在级联上删除? 感谢
答案 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都是我服务器中的外键,在添加或删除寄存器时我没有任何问题。