Обновление возвращает 0, даже если в таблице нет этого идентификатора. - PullRequest
1 голос
/ 06 июня 2019

Я использую sqlite в visual studio.

Я пытаюсь обновить запись, которой нет в моей таблице.

Вот код:

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 голосов
/ 06 июня 2019

Попробуйте проверить, если состояние не в порядке

if( rc != SQLITE_OK )
0 голосов
/ 06 июня 2019

Ваш актуальный вопрос:

Мне нужно обновить конкретную запись, например: 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');

Из ЗАМЕНИТЬ разрешение конфликта Документация:

Когда происходит нарушение ограничения UNIQUE или PRIMARY KEY, алгоритм REPLACE удаляет ранее существующие строки, которые вызывают нарушение ограничения, перед вставкой или обновлением текущей строки, и команда продолжает нормально выполняться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...