我有两个非常简单的表,其中一个引用另一个:
tblBook:
_id integer primary key AUTOINCREMENT
name text
publisher text
tblReader:
_id integer primary key AUTOINCREMENT
name text
grade integer
bookID integer references _id(tblBook)
我实现了我的数据库,它工作正常。但我很确定我的SQLite版本不完全支持外键约束,它允许我删除一本有一个或多个读者的书(可能有许多读者拥有相同的书)。 我想做的就是提示用户,当他想要删除一本书时,所有读者也会被删除,或者只是在没有书籍的情况下留下。但是,我不知道如何构建我的查询来获取该引用。我认为查询所有读者,将他们的bookID放入阵列,查询所有书籍并将他们的ID与读者进行比较似乎效率不高。有什么方法吗?
答案 0 :(得分:0)
按照以下
更改您的第二张表格_id integer primary key AUTOINCREMENT
name text
grade integer
bookID integer
FOREIGN KEY (bookID) references tblBook (_id)
我希望这会对你有所帮助。试试吧。
答案 1 :(得分:0)
以下内容将返回tblReader中具有相同bookID的所有_ids
String query = "SELECT tblReader._id FROM tblReader INNER JOIN tblBook "
+ "ON tblReader._id = tblBook._id WHERE tblReader.bookID=" + bookId;
return myDataBase.rawQuery(query, null);
答案 2 :(得分:0)
你的sql版本是什么? 如果你不知道试试这个:
Cursor cursor = SQLiteDatabase.openOrCreateDatabase(":memory:", null).rawQuery("select sqlite_version() AS sqlite_version", null);
String sqliteVersion = "";
while(cursor.moveToNext()){
sqliteVersion += cursor.getString(0);
}
http://www.sqlite.org/foreignkeys.html“本文档描述了对SQLite版本3.6.19中引入的SQL外键约束的支持。 如果您的版本支持尝试:
@Override
public void onOpen(SQLiteDatabase db) {
super.onOpen(db);
if (!db.isReadOnly()) {
// Enable foreign key constraints
db.execSQL("PRAGMA foreign_keys=ON;");
}
}
答案 3 :(得分:-1)
首先将您的阅读器表修改为
`tblReader: _id整数主键AUTOINCREMENT
名称文字
等级整数
bookID integer FOREIGN KEY(bookID)引用tblBook(_id)`
默认情况下,和SQLite 3不支持外键约束,但我们可以使用TRIGGERS强制执行此类约束。所以你可以根据需要编写触发器。