我正在尝试使用last_insert_rowid()将记录插入到我的“quote_link”表中,以从“quote”表中新创建的记录中获取id。然后我使用它作为值插入到“quote_link”表中的 ql_quote_id 列中。
这有效
tx.executeSql( 'INSERT INTO quotelink(ql_quote_id,ql_cat_id,ql_kind_id) Values (last_insert_rowid(),?,?)', [cat_id,kind_id],
但是,我正在执行许多此类插入,并且只有第一个插入获得了 ql_quote_id 的正确值(对于第二个插入,last_insert_rowid() 的值从第一个插入中获取 id)
我想我需要执行一个选择子查询,但我不知道语法是什么
结果集回调的
SQLResultSet
允许您获取该 ID:
tx.executeSql('INSERT INTO quote(...) VALUES(...)',
[...],
function(tx, result) {
var quote_id = result.insertId;
tx.executeSql('INSERT INTO quotelink(...) VALUES(?,?,?)',
[quote_id, cat_id, kind_id]);
});
我使用以下纯SQLite方法(看起来SQLite不直接支持变量):
BEGIN TRANSACTION;
INSERT INTO quote (...) VALUES(...);
INSERT INTO quote_link (ql_quote_id,...) VALUES (last_insert_rowid(),...);
INSERT INTO quote_line (ql_quote_id,...) VALUES ((SELECT ql_quote_id FROM quote_link WHERE id=last_insert_rowid()),...);
COMMIT TRANSACTION;
因此,第一次插入报价表是很常见的。第一次插入 quote_link 表使用刚刚插入的last_insert_rowid()。所有其余插入到 quote_link 表中的操作都使用先前插入到 quote_link 表中的 ql_quote_id 值。
这样您就无需使用临时表来存储变量类型和其他令人头痛的问题。