更新返回0,即使表中没有此ID

时间:2019-06-06 01:35:53

标签: c++ sql sqlite

我正在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”。但是,事实并非如此。

2 个答案:

答案 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 )