Použil jsem ON DUPLICATE KEY UPDATE
mnoho. Pro některé situace se opravdu vyplatí použít nestandardní SQL rozšíření.
Nejprve se musíte ujistit, že máte nastaveno jedinečné klíčové omezení. ON DUPLICATE KEY UPDATE
funkce se spustí pouze v případě, že by došlo k jedinečnému porušení klíče.
Zde je běžně používaný formát:
$query = "INSERT INTO $table (column1, column2, column3)
VALUES ('value-1', 'value-2', 'value-3')
ON DUPLICATE KEY UPDATE
column1 = values(column1),
column2 = values(column2),
column3 = values(column3);"
column1 = values(column1)
znamená "Aktualizovat sloupec1 hodnotou, která by byla vložena, kdyby dotaz nenarazil na duplicitní porušení klíče." Jinými slovy, znamená to pouze aktualizovat sloupec1 na to, co by bylo, kdyby vložení fungovalo.
Při pohledu na tento kód se nezdá správné, že aktualizujete všechny tři sloupce, které se pokoušíte vložit. Který ze sloupců má jedinečné omezení?
EDIT:Upravte na základě formátu 'SET' příkazu vložení mysql podle otázky z OP.
V zásadě použít ON DUPLICATE KEY UPDATE
, stačí napsat příkaz insert jako normálně, ale přidat ON DUPLICATE KEY UPDATE
klauzule připnutá na konec. Věřím, že by to mělo fungovat takto:
INSERT INTO $table
set column1 = 'value-1',
column2 = 'value-2',
column3 = 'value-3'
ON DUPLICATE KEY UPDATE
column1 = values(column1),
column2 = values(column2),
column3 = values(column3);
Opět platí, že jeden ze sloupců, které vkládáte, musí mít jedinečný index (nebo kombinaci sloupců). Může to být proto, že jeden z nich je primární klíč, nebo proto, že tabulka obsahuje jedinečný index.