SQLite «ВСТАВИТЬ ИЛИ ЗАМЕНИТЬ» против «ОБНОВИТЬ ... ГДЕ» - PullRequest
58 голосов
/ 12 февраля 2010

Я никогда раньше не видел синтаксис INSERT OR REPLACE INTO names (id, name) VALUES (1, "John"), используемый в SQL, и мне было интересно, почему он лучше, чем UPDATE names SET name = "John" WHERE id = 1. Есть ли веская причина использовать один над другим? Этот синтаксис специфичен для SQLite?

Ответы [ 4 ]

85 голосов
/ 12 февраля 2010

ОБНОВЛЕНИЕ не будет делать ничего, если строка не существует.

Где вставка INSERT OR REPLACE, если строка не существует, или замена значений, если она существует.

31 голосов
/ 26 сентября 2012

В настоящее время я работаю над таким утверждением и выяснил еще один факт, на который следует обратить внимание: INSERT OR REPLACE заменит все значения, не указанные в выписке. Например, если ваша таблица содержит столбец «lastname», для которого вы не указали значение, INSERT OR REPLACE по возможности аннулирует «lastname» (ограничения позволяют) или завершится неудачей.

8 голосов
/ 16 ноября 2016
REPLACE INTO table(column_list) VALUES(value_list);

является более короткой формой

INSERT OR REPLACE INTO table(column_list) VALUES(value_list);

Для правильного выполнения REPLACE ваша структура таблицы должна иметь уникальные строки, будь то простой первичный ключ или уникальный индекс.

REPLACE удаляет, затем вставляет запись и вызывает запуск триггера INSERT, если вы их настроили. Если у вас есть триггер на INSERT, вы можете столкнуться с проблемами.


Это обходной путь .. не проверял скорость ..

INSERT OR IGNORE INTO table (column_list) VALUES(value_list);

с последующим

UPDATE table SET field=value,field2=value WHERE uniqueid='uniquevalue'

Этот метод позволяет выполнять замену без запуска.

4 голосов
/ 12 февраля 2010

Запрос вставки или замены вставит новую запись, если id = 1 еще не существует.

Запрос на обновление обновит id = 1, только если он существует, он не создаст новую запись, если он не существует.

...