Ответ 1
UPDATE ничего не сделает, если строка не существует.
Если вставить INSERT или REPLACE, если строка не существует, или заменить значения, если это произойдет.
Я никогда не видел синтаксиса INSERT OR REPLACE INTO names (id, name) VALUES (1, "John")
, который использовался в SQL раньше, и мне было интересно, почему это лучше, чем UPDATE names SET name = "John" WHERE id = 1
. Есть ли веская причина использовать один над другим. Является ли этот синтаксис специфичным для SQLite?
UPDATE ничего не сделает, если строка не существует.
Если вставить INSERT или REPLACE, если строка не существует, или заменить значения, если это произойдет.
В настоящее время я работаю над таким выражением и выяснил еще один факт: INSERT или REPLACE заменит любые значения, не указанные в инструкции. Например, если ваша таблица содержит столбец "lastname", для которого вы не указали значение, INSERT или REPLACE скроют "последнее имя", если это возможно (ограничения разрешают его) или сбой.
Вставить или заменить запрос будет вставить новую запись, если id = 1 еще не существует.
Запрос на обновление будет только oudate id = 1, если он существует, он не будет создавать новую запись, если она не существует.
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'
Этот метод позволяет выполнить замену без возникновения триггера.