0

想象一下,我有以下 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对象直接 ing 语句,但这

//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()

id3)如果表到目前为止没有行,上面的代码会返回什么值?零?

4

1 回答 1

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)如果你有整数主键列,sqlitelast_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。

于 2015-11-17T00:48:04.530 回答