嗨,我有一个 sqlite db,我正在使用内置于 sqlite 数据库驱动程序的 qts 进行操作。
我有一个小型测试应用程序,允许我从行编辑运行 sql 查询,它将被执行,然后在相关模型的视图中更新结果。
我创建了一个使用自动递增主键值的表,但是如果我在不提供键的情况下执行插入语句,则会插入两行,每行都有一个自动递增值。
如果我提供键值,则只创建一行。任何想法为什么会这样?
表很简单,例如
CREATE TABLE GroupNames ( ID integer PRIMARY KEY AUTOINCREMENT NOT NULL UNIQUE, Name varchar(50))
当我运行查询时
insert into groupnames (name) values ("testName");
我得到两个带有自动递增 ID 的新行。但是,如果我运行
insert into groupnames (id, name) values (100, "testName");
我按预期得到了一行,正确的 id 为 100。另外值得注意的是,如果我尝试
insert into table groupnames (id, name) values (100, "testName");
insert into table groupnames (name) values ("testName");
查询不运行。运行查询的 qt 代码再简单不过了:
QSqlQuery *DbCore::run_query(const QString &query_string)
{
QSqlDatabase db = QSqlDatabase::database(defConnectionName);
if(!db.isOpen())
return NULL;
QSqlQuery *q = new QSqlQuery(query_string, db);
q->exec();
return q;
}
我添加了一些日志代码来检查查询是否执行一次:
QSqlDatabase db = QSqlDatabase::database(defConnectionName);
if(!db.isOpen())
return NULL;
qDebug() << "Running query:" << query_string;
QSqlQuery *q = new QSqlQuery(query_string, db);
if(!q->exec())
qDebug() << "Error running query:" << q->lastError();
return q;
日志确认我只执行一次:
Running query: "insert into groupnames (name) values ("hello")"
如果我然后使用 sqlite3 shell 检查数据库(以消除对 qt 视图等的任何疑问):
sqlite> select * from groupnames;
1|hello
2|hello