在 bindValue(...) 函数中使用 select 语句 - Qt & SQLite
Using a select statement in the bindValue(...) function - Qt & SQLite
假设我有以下 SQLite table 定义:
create table test (id integer primary key, info integer);
和以下条目:
id | info
----------
1 | 10
2 | 20
3 | 30
我想使用 Qt 的 QSqlQuery
class 来 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
虽然这可以直接通过 QSqlQuery qry
对象 exec()
ing 语句,但 this
//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) 如果 table 到目前为止没有任何行,上面的代码将为 id
返回什么值?零?
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()
将 return 该列的值,所以你可以简单地写:
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) 如果 table 为空,则此 select
将 return null
,并且 null+100
仍为 null
,并且此将触发自动递增,因此插入 1。
假设我有以下 SQLite table 定义:
create table test (id integer primary key, info integer);
和以下条目:
id | info
----------
1 | 10
2 | 20
3 | 30
我想使用 Qt 的 QSqlQuery
class 来 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
虽然这可以直接通过 QSqlQuery qry
对象 exec()
ing 语句,但 this
//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) 如果 table 到目前为止没有任何行,上面的代码将为 id
返回什么值?零?
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()
将 return 该列的值,所以你可以简单地写:
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) 如果 table 为空,则此 select
将 return null
,并且 null+100
仍为 null
,并且此将触发自动递增,因此插入 1。