Comment mettre à jour si existant, insérer sinon (AKA & # 8220; upsert & # 8221; ou & # 8220; fusion & # 8221;) dans MySQL?

StackOverflow https://stackoverflow.com/questions/1218905

Question

Existe-t-il un moyen simple de INSÉRER une ligne quand elle n'existe pas ou de UPDATE si elle existe, en utilisant une requête MySQL?

Était-ce utile?

La solution

Oui, INSERER ... ON DUPLICATE KEY UPDATE . Par exemple:

INSERT INTO `usage`
(`thing_id`, `times_used`, `first_time_used`)
VALUES
(4815162342, 1, NOW())
ON DUPLICATE KEY UPDATE
`times_used` = `times_used` + 1

Autres conseils

Je sais que c'est une vieille question, mais Google m'a récemment conduit ici, alors j'imagine que d'autres y viennent aussi.

@chaos est correct: il existe le < code> INSERT ... ON DUPLICATE KEY UPDATE syntaxe.

Cependant, la question initiale concernait spécifiquement MySQL et, dans MySQL, se trouvait REMPLACER DANS ... syntaxe. IMHO, cette commande est plus facile et plus simple à utiliser pour les upserts. À partir du manuel:

  

REPLACE fonctionne exactement comme INSERT, sauf que si une ancienne ligne de la table a la même valeur qu'une nouvelle ligne pour PRIMARY KEY ou un index UNIQUE, l'ancienne ligne est supprimée avant que la nouvelle ligne ne soit insérée.

Notez que ce n'est pas du SQL standard. Un exemple tiré du manuel:

CREATE TABLE test (
  id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  data VARCHAR(64) DEFAULT NULL,
  ts TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (id)
);

mysql> REPLACE INTO test VALUES (1, 'Old', '2014-08-20 18:47:00');
Query OK, 1 row affected (0.04 sec)

mysql> REPLACE INTO test VALUES (1, 'New', '2014-08-20 18:47:42');
Query OK, 2 rows affected (0.04 sec)

mysql> SELECT * FROM test;
+----+------+---------------------+
| id | data | ts                  |
+----+------+---------------------+
|  1 | New  | 2014-08-20 18:47:42 |
+----+------+---------------------+
1 row in set (0.00 sec)

Modifier: juste un avertissement juste que REPLACE IN ne ressemble pas à UPDATE . Comme le dit le manuel, REPLACE supprime la ligne si elle existe, puis en insère une nouvelle. (Notez les drôles "2 lignes affectées" dans l'exemple ci-dessus.) En d'autres termes, il remplacera les valeurs de toutes les colonnes d'un enregistrement existant (et ne mettra pas simplement à jour certaines > colonnes.) Le comportement de REPLACE INTO de MySQL est très semblable à celui de INSERT OR REPLACE INTO de SQLite. Consultez cette question pour connaître certaines solutions de contournement si vous souhaitez uniquement mettre à jour quelques colonnes ( et pas toutes les colonnes) si l'enregistrement existe déjà.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top