node-sqlite3を使用して、node.jsアプリケーションからデータベースでINSERT + UPDATEトランザクションを実行しようとしています。しかし、私はトランザクションが完了したときにlast_insert_rowidを取得する方法を理解することはできません。トランザクションからlast_insert_rowidを取得する方法は?
BEGIN TRANSACTION;
INSERT INTO <table> (field1, ...) VALUES (value1, ...);
UPDATE <table> SET prev=last_insert_rowid() WHERE <condition>;
END TRANSACTION;
この文字列(マイナス余分な空白)VAR q
に割り当てられている:私のクエリは次のようなものが見えます。
私は私のデータベースは、この使用していくつかの点で開いたんだ:
var db = new sqlite3.Database(dbfile)
をしかし、私は使用しようとします
db.run(q, function(err) {
if (err) ...
console.log(this.lastId)
})
を、それはエラーなしで「0」を印刷しないだけでなく、データベースへの変更は発生しません!!! run
の代わりにexec
を使用すると、クエリは正常に実行されますが、execからデータを取得する方法はありません。
私も試してみました。このような何か:
db.exec(q, function(err) {
if (err) ...
db.run(";", function(err) {
if (err) ...
console.log(this.lastId)
})
})
しかし、「ファイル名を指定して実行」で「この」文脈はlastId性質を持っていません!
また、sqlite3-transactionパッケージも見ましたが、トランザクションコールバックにも情報を提供していないようです。
挿入を別のrun()として実行することはできません。this.lastId
を取得し、それを使用して更新プログラムを実行してください。これにより、データベースが2つのステートメント間で無効な状態になるためです。トランザクション)。
このトランザクションからlast_insert_rowid()を取得するにはどうすればよいですか?
MySQLで最も最近挿入されたIDを取得する機能は、いくつかの前提条件に加えて、使用されているドライバ(たとえばPerl + 'DBI' +' DBD :: mysql'モジュール)に依存する可能性があります例えば、テーブルIDが整数インクリメントに設定されている必要があります。特定のケースで同様の要件または異なる要件が適用されるかどうかを確認しましたか?どの問合せが最後に実行されたかにも依存する可能性があります。したがって、実際のトランザクションのコンテキストでもそれを実行できるかどうかを確認する必要があります。 – ray
'run'を別々に呼び出しても、トランザクションを使用することができます。 'run(" BEGIN TRANSACTION "、...)'などを呼び出して、完了したら 'COMMIT TRANSACTION'を呼び出すか、エラーがあれば' ROLLBACK TRANSACTION'を呼び出してください。 – cartant
@カルタントありがとう、私は確かに発見し、私は昨日出発する前に正常にそれを試してみましたが、時間がまだそれを文書化していない。 – Michael