MySql Table Insert si 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.

METTRE À JOUR

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

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

Notez que vous n’avez pas besoin d’inclure le datenum dans la clause update car c’est la clé unique, elle ne doit donc pas être modifiée. Vous devez inclure toutes les autres colonnes de votre table. Vous pouvez utiliser la fonction VALUES() pour vous assurer que les valeurs correctes 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 pour MySQL:

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

Essayez d’utiliser ceci :

Si vous spécifiez ON DUPLICATE KEY UPDATE et qu’une ligne est insérée pour provoquer une duplication de valeur dans un 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 comme 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 l’indicateur CLIENT_FOUND_ROWS à mysql_real_connect() lors de la connexion à mysqld , la valeur des lignes affectées est 1 (pas 0) si une ligne existante est définie sur ses valeurs actuelles …

J’avais une situation où je devais mettre à jour ou insérer sur une table en fonction de deux champs (les 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 extrait de l’une de mes bases de données, avec les parameters d’entrée (deux noms et un numéro) remplacés par [hasher_name], [hash_name] et [new_value]. Le SELECT … LIMIT 1 nested extrait le premier de l’enregistrement existant ou d’un nouvel enregistrement (last_recogs.id est une clé primaire à incrémentation automatique) et l’utilise comme entrée de valeur dans REPLACE INTO.