我正在Visual Studio中使用sqlite。
我正在尝试更新表中不存在的记录。
代码如下:
const char* sqlUpdateTable = "UPDATE MyTable SET name = '25th' WHERE id = 25;";
rc = sqlite3_exec(db, sqlUpdateTable, NULL, NULL, &error);
if (rc)
{
cerr << "Error executing SQLite3 statement: " << sqlite3_errmsg(db) << endl << endl;
sqlite3_free(error);
}
else
{
cout << "Updated MyTable." << endl << endl;
}
我将始终看到“更新的MyTable”。但是,事实并非如此。
答案 0 :(得分:0)
您的实际问题:
我需要更新特定记录,例如:PRIMARY KEY id = 10,如果该记录不存在,则需要插入。
现代版本的Sqlite支持Postgres样式的UPSERT表示法:
INSERT INTO myTable(id, name) VALUES (25, '25th') ON CONFLICT (id) DO UPDATE SET name = '25th';
假设id
是主键或唯一列,则将插入新行或使用该id
更新现有行的名称列。
较旧的版本可以使用INSERT OR REPLACE得到类似的内容:
INSERT INTO myTable(id, name) VALUES (25, 'Original Name');
-- At some later point...
INSERT OR REPLACE INTO myTable(id, name) VALUES (25, '25th');
摘自REPLACE conflict resolution文档:
当发生UNIQUE或PRIMARY KEY约束冲突时,REPLACE算法会在插入或更新当前行之前删除导致约束冲突的现有行,并且该命令将继续正常执行。
答案 1 :(得分:-1)
尝试检查状态是否不正常
if( rc != SQLITE_OK )