web-dev-qa-db-fra.com

Tableau MySql Insert s'il n'existe pas sinon mise à jour

UPDATE AggregatedData SET datenum="734152.979166667", 
Timestamp="2010-01-14 23:30:00.000" WHERE datenum="734152.979166667";

Cela fonctionne si le datenum existe, mais je veux insérer ces données en tant que nouvelle ligne si le datenum n'existe pas.

MISE À JOUR

le datenum est unique mais ce n'est pas la clé primaire

91
OHLÁLÁ

Jai a raison de dire que vous devriez utiliser INSERT ... ON DUPLICATE KEY UPDATE.

Notez qu'il n'est pas nécessaire d'inclure datenum dans la clause de mise à jour car c'est la clé unique, elle ne devrait donc pas changer. Vous devez inclure toutes les autres colonnes de votre table. Vous pouvez utiliser la fonction VALUES() pour vous assurer que les valeurs appropriées sont utilisées lors de la mise à jour des autres colonnes.

Voici votre mise à jour ré-écrite en utilisant la syntaxe INSERT ... ON DUPLICATE KEY UPDATE Appropriée pour MySQL:

INSERT INTO AggregatedData (datenum,Timestamp)
VALUES ("734152.979166667","2010-01-14 23:30:00.000")
ON DUPLICATE KEY UPDATE 
  Timestamp=VALUES(Timestamp)
128
Ike Walker

Essayez d'utiliser this :

Si vous spécifiez ON DUPLICATE KEY UPDATE Et qu'une ligne est insérée, une valeur dupliquée serait créée dans une UNIQUE index or PRIMARY KEY , MySQL performs an [ UPDATE`] ( http: // dev. .mysql.com/doc/refman/5.7/fr/update.html ) de l'ancienne ligne ...

La clause ON DUPLICATE KEY UPDATE Peut contenir plusieurs affectations de colonnes, séparées par des virgules.

Avec ON DUPLICATE KEY UPDATE, La valeur des lignes affectées par ligne est 1 si la ligne est insérée en tant que nouvelle ligne, 2 si une ligne existante est mise à jour et 0 si une ligne existante est définie sur ses valeurs actuelles. Si vous spécifiez le drapeau CLIENT_FOUND_ROWS Sur mysql_real_connect() lors de la connexion à mysqld , la valeur des lignes affectées est 1 (et non 0) si une ligne existante est définie sur ses valeurs actuelles ...

14
Jai

J'ai eu une situation où je devais mettre à jour ou insérer sur une table en fonction de deux champs (deux clés étrangères) sur lesquels je ne pouvais pas définir une contrainte UNIQUE (donc INSERT ... ON DUPLICATE KEY UPDATE ne fonctionnera pas). Voici ce que j'ai fini par utiliser:

replace into last_recogs (id, hasher_id, hash_id, last_recog) 
  select l.* from 
    (select id, hasher_id, hash_id, [new_value] from last_recogs 
     where hasher_id in (select id from hashers where name=[hasher_name])
     and hash_id in (select id from hashes where name=[hash_name]) 
     union 
     select 0, m.id, h.id, [new_value] 
     from hashers m cross join hashes h 
     where m.name=[hasher_name] 
     and h.name=[hash_name]) l 
  limit 1;

Cet exemple est créé à partir de l'une de mes bases de données, les paramètres d'entrée (deux noms et un nombre) étant remplacés par [nom_hôte], [nom_hôte] et [valeur_nouvelle]. SELECT ... LIMIT 1 imbriqué extrait le premier de l'enregistrement existant ou d'un nouvel enregistrement (last_recogs.id est une clé primaire auto-incrémentée) et l'utilise comme valeur entrée dans REPLACE INTO.

1
salfter