Existe-t-il un moyen facile d'accéder à INSERT
une ligne lorsqu'elle n'existe pas, ou UPDATE
si elle existe, en utilisant une requête MySQL?
sql
mysql
insert-update
upsert
blub
la source
la source
MERGE
. En général, le concept est souvent appelé"UPSERT"
.geb
ettopic
cela fonctionnera (ALTER TABLE table ADD UNIQUE geb_by_topic (geb, topic)
).MERGE
mais je ne suis pas sûr que sa syntaxe soit identique à celle de SQL Server.NULL
, pour permettre auauto_increment
comportement de fonctionner (qui sinon, oui, fonctionne comme vous le supposez; voir dev.mysql.com/doc/refman/5.5/en/example-auto-increment. html ).VALUES(col)
pour obtenir la valeur de l'argument d'insertion en cas de duplication. Ex:ON DUPLICATE UPDATE b = VALUES(b), c = VALUES(c)
Je sais que c'est une vieille question, mais Google m'a conduit ici récemment, alors j'imagine que d'autres viennent ici aussi.
@chaos est correct: il y a la
INSERT ... ON DUPLICATE KEY UPDATE
syntaxe.Cependant, la question originale posée spécifiquement sur MySQL, et dans MySQL, il y a la
REPLACE INTO ...
syntaxe. À mon humble avis, cette commande est plus facile et plus simple à utiliser pour les upserts. À partir du manuel:Notez que ce n'est pas du SQL standard. Un exemple tiré du manuel:
Edit: Juste un avertissement qui
REPLACE INTO
ne ressemble pasUPDATE
. Comme le dit le manuel,REPLACE
supprime la ligne si elle existe, puis en insère une nouvelle. (Notez le drôle "2 lignes affectées" dans l'exemple ci-dessus.) Autrement dit, cela remplacera les valeurs de toutes les colonnes d'un enregistrement existant (et ne mettra pas simplement à jour certaines colonnes.) Le comportement de MySQLREPLACE INTO
ressemble beaucoup à celui de SqliteINSERT OR REPLACE INTO
. Consultez cette question pour obtenir des solutions de contournement si vous ne souhaitez mettre à jour que quelques colonnes (et non toutes les colonnes) si l'enregistrement existe déjà.la source