Есть ли простой способ для INSERT
строки, когда она не существует, или UPDATE
если она существует, используя один запрос MySQL?
sql
mysql
insert-update
upsert
реветь
источник
источник
MERGE
. В общем, понятие часто упоминается как"UPSERT"
.geb
иtopic
он будет работать (ALTER TABLE table ADD UNIQUE geb_by_topic (geb, topic)
).MERGE
но я не уверен, что его синтаксис идентичен синтаксису SQL Server.NULL
, чтобыauto_increment
поведение работало (в противном случае, да, работает так, как вы предполагаете; см. Dev.mysql.com/doc/refman/5.5/en/example-auto-increment. HTML ).VALUES(col)
чтобы получить значение из аргумента вставки в случае дублирования. Например:ON DUPLICATE UPDATE b = VALUES(b), c = VALUES(c)
Я знаю, что это старый вопрос, но Google недавно привел меня сюда, поэтому я думаю, что другие тоже приходят сюда.
@chaos правильно:
INSERT ... ON DUPLICATE KEY UPDATE
синтаксис есть.Тем не менее, оригинальный вопрос задан именно о MySQL, и в MySQL есть
REPLACE INTO ...
синтаксис. ИМХО, эта команда проще и проще в использовании для upserts. Из руководства:Обратите внимание, что это не стандартный SQL. Пример из руководства:
Изменить: Просто справедливое предупреждение,
REPLACE INTO
которое не похожеUPDATE
. Как сказано в руководстве,REPLACE
удаляет строку, если она существует, а затем вставляет новую. (Обратите внимание на забавные «затронутые 2 строки» в приведенном выше примере.) То есть он заменит значения всех столбцов существующей записи (а не просто обновит некоторые столбцы.) Поведение MySQL воREPLACE INTO
многом похоже на поведение SqliteINSERT OR REPLACE INTO
. Посмотрите этот вопрос для некоторых обходных путей, если вы хотите обновить только несколько столбцов (и не все столбцы), если запись уже существует.источник