SQLite中的外键约束

时间:2013-05-09 03:48:16

标签: android sqlite foreign-keys

我有两个非常简单的表,其中一个引用另一个:

 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与读者进行比较似乎效率不高。有什么方法吗?

4 个答案:

答案 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强制执行此类约束。所以你可以根据需要编写触发器。