Привет, у меня есть база данных sqlite, которой я манипулирую, используя qts, встроенный в драйвер базы данных sqlite.
У меня есть небольшое тестовое приложение, которое позволяет мне запускать sql-запрос из редактирования строки, и он будет выполнен, а затем результаты обновлены в представлении соответствующей модели.
Я создал таблицу, в которой используются автоинкрементные значения первичного ключа, но если я выполняю инструкцию вставки без указания ключа, я получаю две вставленные строки, каждая из которых имеет автоинкрементное значение.
Если я предоставлю значение ключа, будет создана только одна строка.Есть идеи, почему это так?
Таблица достаточно проста, например,
CREATE TABLE GroupNames ( ID integer PRIMARY KEY AUTOINCREMENT NOT NULL UNIQUE, Name varchar(50))
, и когда я запускаю запрос
insert into groupnames (name) values ("testName");
, я получаю две новые строки с автоматически инкрементированными идентификаторами,Однако, если я запускаю
insert into groupnames (id, name) values (100, "testName");
, я получаю одну строку, как и ожидалось, с правильным идентификатором 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 (чтобы устранить любые сомнения относительно представлений qt и т. д.):
sqlite> select * from groupnames;
1|hello
2|hello