こんにちは、sqliteデータベースドライバーに組み込まれたqtsを使用して操作しているsqlite dbがあります。
行編集からSQLクエリを実行できる小さなテストアプリがあり、それが実行され、関連するモデルのビューで結果が更新されます。
自動インクリメントされた主キー値を使用するテーブルを作成しましたが、キーを指定せずに挿入ステートメントを実行すると、それぞれ自動インクリメントされた値を持つ 2 つの行が挿入されます。
キー値を指定すると、1 行だけが作成されます。これはなぜですか?
テーブルは十分に単純です。
CREATE TABLE GroupNames ( ID integer PRIMARY KEY AUTOINCREMENT NOT NULL UNIQUE, Name varchar(50))
そしてクエリを実行すると
insert into groupnames (name) values ("testName");
自動インクリメントされた ID を持つ 2 つの新しい行を取得します。ただし、実行すると
insert into groupnames (id, name) values (100, "testName");
正しいID 100で、期待どおりに1行を取得します。また、試してみると
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;
}
クエリが 1 回実行されることを確認するために、いくつかのログ コードを追加しました。
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