Czy istnieje łatwy sposób na INSERT
uzyskanie wiersza, gdy nie istnieje, lub UPDATE
jeśli istnieje, za pomocą jednego zapytania MySQL?
sql
mysql
insert-update
upsert
blub
źródło
źródło
MERGE
. Ogólnie pojęcie to jest często określane jako"UPSERT"
.geb
itopic
będzie działał (ALTER TABLE table ADD UNIQUE geb_by_topic (geb, topic)
).MERGE
ale nie jestem pewien, czy jego składnia jest identyczna z SQL Server.NULL
, aby umożliwićauto_increment
zachowanie działania (co w przeciwnym razie tak, działa tak, jak zakładasz ; zobacz dev.mysql.com/doc/refman/5.5/en/example-auto-increment. html ).VALUES(col)
aby uzyskać wartość z argumentu wstawiania w przypadku duplikatu. Np .:ON DUPLICATE UPDATE b = VALUES(b), c = VALUES(c)
Wiem, że to stare pytanie, ale Google ostatnio mnie tu przyprowadziło, więc wyobrażam sobie, że inni też tu przychodzą.
@chaos jest poprawne: istnieje
INSERT ... ON DUPLICATE KEY UPDATE
składnia.Jednak pierwotne pytanie dotyczyło MySQL, aw MySQL jest
REPLACE INTO ...
składnia. IMHO, to polecenie jest łatwiejsze i prostsze w użyciu do upserts. Z instrukcji:Zauważ, że to nie jest standardowy SQL. Przykład z instrukcji:
Edycja: po prostu uczciwe ostrzeżenie, które
REPLACE INTO
nie jest jakUPDATE
. Jak mówi instrukcja,REPLACE
usuwa wiersz, jeśli istnieje, a następnie wstawia nowy. (Zwróć uwagę na zabawne „2 wiersze dotknięte” w powyższym przykładzie). Oznacza to, że zastąpi on wartości wszystkich kolumn istniejącego rekordu (a nie tylko zaktualizuje niektóre kolumny). Zachowanie MySQLREPLACE INTO
jest bardzo podobne do SqliteINSERT OR REPLACE INTO
. Zobacz to pytanie , aby poznać niektóre obejścia, jeśli chcesz zaktualizować tylko kilka kolumn (a nie wszystkie), jeśli rekord już istnieje.źródło