Я никогда не видел синтаксиса INSERT OR REPLACE INTO names (id, name) VALUES (1, "John")
, который использовался в SQL раньше, и мне было интересно, почему это лучше, чем UPDATE names SET name = "John" WHERE id = 1
. Есть ли веская причина использовать один над другим. Является ли этот синтаксис специфичным для SQLite?
SQLite "ВСТАВИТЬ ИЛИ ЗАМЕНИТЬ В" и "ОБНОВИТЬ... ГДЕ"
Ответ 1
UPDATE ничего не сделает, если строка не существует.
Если вставить INSERT или REPLACE, если строка не существует, или заменить значения, если это произойдет.
Ответ 2
В настоящее время я работаю над таким выражением и выяснил еще один факт: INSERT или REPLACE заменит любые значения, не указанные в инструкции. Например, если ваша таблица содержит столбец "lastname", для которого вы не указали значение, INSERT или REPLACE скроют "последнее имя", если это возможно (ограничения разрешают его) или сбой.
Ответ 3
Вставить или заменить запрос будет вставить новую запись, если id = 1 еще не существует.
Запрос на обновление будет только oudate id = 1, если он существует, он не будет создавать новую запись, если она не существует.
Ответ 4
REPLACE INTO table(column_list) VALUES(value_list);
- более короткая форма
INSERT OR REPLACE INTO table(column_list) VALUES(value_list);
Для правильной работы REPLACE структура вашей таблицы должна иметь уникальные строки, будь то простой первичный ключ или уникальный индекс.
REPLACE удаляет, затем INSERT записывает запись и вызывает запуск триггера INSERT, если у вас есть настройка. Если у вас есть триггер на INSERT, вы можете столкнуться с проблемами.
Это работа вокруг. Не проверена скорость.
INSERT OR IGNORE INTO table (column_list) VALUES(value_list);
за которым следует
UPDATE table SET field=value,field2=value WHERE uniqueid='uniquevalue'
Этот метод позволяет выполнить замену без возникновения триггера.