0

2 つの非常に単純なテーブルがあり、一方が他方を参照しています。

 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 は外部キー制約を完全にはサポートしておらず、1 人以上のリーダー (同じ本を持っている多くのリーダーが存在する可能性があります) を持つブックを削除できます。私がやりたいのは、ユーザーが本を削除したいときに、すべての読者も削除されるか、本が割り当てられずにそのままになることをユーザーに促すことだけです。ただし、その参照を取得するためにクエリを作成する方法がわかりません。すべての読者にクエリを実行し、その bookID を配列に入れ、すべての本をクエリし、それらの ID を読者と比較することは効率的ではないように思われます。それを回避する方法はありますか?

4

4 に答える 4

0

以下は、同じ bookID を持つ tblReader からすべての _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);
于 2013-05-09T04:55:36.500 に答える
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;");
}
}
于 2013-08-03T22:33:41.680 に答える
-1

最初にリーダーテーブルを次のように変更します

`tblReader: _id integer 主キー AUTOINCREMENT

名前テキスト

成績整数

bookID integer FOREIGN KEY (bookID) は tblBook (_id) を参照します`

SQLite 3 はデフォルトで外部キー制約をサポートしていませんが、TRIGGERS を使用してそのような制約を強制できます。したがって、必要に応じてトリガーを作成できます。

于 2013-05-09T04:19:38.133 に答える