sql >> Databáze >  >> RDS >> Mysql

Mohu použít ON DUPLICATE KEY UPDATE s dotazem INSERT pomocí možnosti SET?

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.



  1. Při kontrole připojení se nelze připojit k žádnému ze zadaných hostitelů MySQL

  2. Použití Microsoft DiskSpd k testování úložného subsystému

  3. Proč je platný SELECT bez sloupců

  4. Vyhledávání s diakritikou ve sqlite (android)