我正在创建Android应用程序,现在我对正确的数据库设计感到困惑。
我的本地sqlite db中有3个表:
BOXES id title
NOTES id title content
BOXES_NOTES id box_id element_id type
元素ID是 NOTES.id 或 BOXES.id 的id,现在我想把它作为外键,所以当我删除 BOXES中的条目时或注意,我想适当更新 BOXES_NOTES 表。我该怎么办?
答案 0 :(得分:1)
CREATE TABLE BOXES_NOTES(
ID .... REFERENCES NOTES(ID) ON DELETE /*your constraint*/
BOX_ID ... REFERENCES BOXES(ID) ON DELETE /*your constraint*/
... )
ON DELETE后,您可以添加:
NO ACTION
- >如果box_notes
CASCADE
- >如果删除框行,则将删除具有该id的所有boxes_notes行
SET NULL
- >如果删除框行,则所有具有该id的boxes_notes行将设置为null(如果可能)
ON DELETE的内容对ON UPDATE也有效。
请记住,使用SQLite必须使外键控制变得容易。我建议你使用SQLiteOpenHelper并覆盖onOpen方法:
public void onOpen(SQLiteDatabase db){
super.onOpen(db);
if (!db.isReadOnly()) {
// Enable foreign key constraints
db.execSQL("PRAGMA foreign_keys=ON");
}
}
答案 1 :(得分:0)
[box_id] INTEGER CONSTRAINT [box_ref] REFERENCES [BOXES]([id]) ON DELETE CASCADE NOT NULL,
[element_id] INTEGER CONSTRAINT [notes_ref] REFERENCES [NOTES]([id]) ON DELETE CASCADE NOT NULL,
因为我们在box_id和element_id中都有级联删除,所以框中或删除的注释中的任何条目都会在此表中级联删除条目
建议 - 使用适当的命名约定 而不是element_id名称,它是notes__id(通常用于命名外键的双下划线
让所有这些在sqlite中工作一件重要的事情是我们必须在数据库级别启用外键约束,默认情况下在android中禁用
启用外键约束执行以下操作 db.execSQL(“PRAGMA foreign_keys = ON;”);
答案 2 :(得分:0)
没关系,我稍微重新设计了DB,所以现在我只有2个表:
BOXES id title box_id
NOTES id title content box_id
谢谢大家的回答。