0

私はSQLiteを使用しています。私は2つのテーブルを持っています:

Log:
    pid INTEGER PRIMARY KEY AUTOINCREMENT
    action INTEGER NOT NULL
    .... ect.

ErrorExtras:
    pid INTEGER REFERENCES log(pid)
    msg TEXT,
    request TEXT

エラーが発生した場合は、両方に挿入したいと思います。ログへの挿入はPIDを生成するため簡単ですが、クエリを実行せずにPIDがわからないため、ErrorExtrasへの挿入は困難です。Logに挿入し、PIDを照会してから、ErrorExtrasに挿入すると、かなり面倒に見えます。これらの種類の挿入物に何らかのショートカットはありますか?

私の場合、これはログ内の他の情報がpidを一意に識別するために可能です(したがって、結合されたキーがあります)が、そうでない場合はどうなりますか?

4

2 に答える 2

1

insert_idを照会する必要はありません。のselectステートメントでlast_insert_idErrorExtrasを使用するだけで、Bobはあなたの叔父です。

于 2013-01-09T00:56:15.783 に答える
1

SQLコマンドを制御できる場合は、次のようなlast_insert_rowidSQL関数を使用できます。

INSERT INTO Log(action) VALUES(42);
INSERT INTO ErrorExtras(pid, msg) VALUES(last_insert_rowid(), 'x');

(ただし、これは次のコマンドでのみ機能します。これは、INSERT後でレコードlast_insert_rowid()のを返すためです。)rowidErrorExtras


C APIを使用している場合は、次のsqlite3_last_insert_rowid関数を使用できます。

sqlite3_prepare_v2(db, "INSERT INTO Log(action) VALUES(42)", -1, &stmt, NULL);
sqlite3_step(stmt);
sqlite3_finalize(stmt);

sqlite3_prepare_v2(db, "INSERT INTO ErrorExtras(pid,msg) VALUES(?,?)", -1, &stmt, NULL);
sqlite3_bind_int64(stmt, 1, sqlite3_last_insert_rowid(db));
sqlite3_bind_text(stmt, 2, "x", -1, SQLITE_TRANSIENT);
sqlite3_step(stmt);
sqlite3_finalize(stmt);

他の言語のAPIには、通常、最後に挿入されたを取得するためのメカニズムもありますrowid。たとえば、Androidでは、insert関数はそれを返します。

ContentValues cv = new ContentValues();
cv.put("action", 42);
long log_rowid = db.insert("Log", null, cv);
ContentValues cv = new ContentValues();
cv.put("pid", log_rowid);
cv.put("msg", "x");
db.insert("ErrorExtras", null, cv);
于 2013-01-09T09:08:05.327 に答える