想象一下,我有以下SQLite表定义:
create table test (id integer primary key, info integer);
以及以下条目:
id | info
----------
1 | 10
2 | 20
3 | 30
我想使用Qt的QSqlQuery
类来prepare()
查询并使用bindValue()
函数。
我想要达到的目标是
insert into test values (
( select id from test where ROWID = last_insert_rowid() )+100,
666
);
为了获得:
id | info
----------
1 | 10
2 | 20
3 | 30
103 | 666
虽然通过exec()
对象直接QSqlQuery qry
语句,但
//qry is set up correctly.
qry.prepare("insert into test values (?,?);");
qry.bindValue(0, "select id from test where ROWID = last_insert_rowid() )+100");
qry.bindValue(1,666);
qry.exec();
不起作用(数据类型不匹配)。
1)如何使用bindValue()
?
2)在没有使用last_insert_rowid()
的情况下实现相同行为的最佳方法是什么?
3)如果表到目前为止没有行,那么id
上面的代码将返回什么值?零?
答案 0 :(得分:3)
1)您无法将SQL表达式绑定到"?",这是绑定目的。忘记第一个"?"并且只绑定一个值:
qry.prepare("insert into test values ( (select id from test where ROWID = last_insert_rowid() )+?,?);");
qry.bindValue(0,100);
qry.bindValue(0,666);
qry.exec();
2)如果你有整数主键列,sqlite last_insert_rowid()
将返回该列的值,所以你可以简单地写:
qry.prepare("insert into test values (last_insert_rowid()+?,?);");
qry.bindValue(0,100);
qry.bindValue(0,666);
qry.exec();
考虑到您的预期行为,这不会像自动增量一样,因为有人可以在索引处插入一个值,导致下一次插入的冲突。更加防弹的方法是增加最大值:
qry.prepare("insert into test values ( (select id from test order by id desc limit 1)+?,?);");
qry.bindValue(0,100);
qry.bindValue(0,666);
qry.exec();
3)如果表格为空,则select
将返回null
,null+100
仍为null
,这将触发自动增量,因此插入1。