Mysql
 sql >> Base de données >  >> RDS >> Mysql

Puis-je utiliser ON DUPLICATE KEY UPDATE avec une requête INSERT utilisant l'option SET ?

J'ai utilisé ON DUPLICATE KEY UPDATE beaucoup. Dans certaines situations, c'est une extension SQL non standard qui vaut vraiment la peine d'être utilisée.

Tout d'abord, vous devez vous assurer d'avoir une contrainte de clé unique en place. Le ON DUPLICATE KEY UPDATE la fonction n'intervient que s'il y avait eu une violation de clé unique.

Voici un format couramment utilisé :

 $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) signifie "Mettre à jour la colonne1 avec la valeur qui aurait été insérée si la requête n'avait pas atteint la violation de clé en double." En d'autres termes, cela signifie simplement mettre à jour la colonne 1 à ce qu'elle aurait été si l'insertion avait fonctionné.

En regardant ce code, il ne semble pas correct que vous mettiez à jour les trois colonnes que vous essayez d'insérer. Laquelle des colonnes a une contrainte unique ?

EDIT :Modifier en fonction du format "SET" de l'instruction d'insertion mysql selon la question de l'OP.

Fondamentalement, utiliser ON DUPLICATE KEY UPDATE , vous écrivez simplement l'instruction d'insertion comme vous le feriez normalement, mais ajoutez le ON DUPLICATE KEY UPDATE clause collée à la fin. Je pense que cela devrait fonctionner comme ceci :

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);

Encore une fois, l'une des colonnes que vous insérez doit avoir un index unique (ou une combinaison des colonnes). Cela peut être dû au fait que l'un d'eux est la clé primaire ou parce qu'il existe un index unique sur la table.