102 votes

Table MySql Insérer si non existant sinon mettre à 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 les datenum n'existe pas.

UPDATE

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

139voto

Ike Walker Points 21162

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

Notez que vous n'avez pas besoin d'inclure datenum dans la clause de mise à jour puisqu'il s'agit de la clé unique, elle ne doit donc pas changer. Vous devez inclure toutes les autres colonnes de votre table. Vous pouvez utiliser la clause VALUES() pour s'assurer que les bonnes valeurs sont utilisées lors de la mise à jour des autres colonnes.

Voici votre mise à jour réécrite en utilisant la bonne méthode 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)

16voto

Jai Points 2083

Essayez d'utiliser ce :

Si vous spécifiez ON DUPLICATE KEY UPDATE et qu'une ligne est insérée, ce qui entraînerait une valeur en double dans un fichier de type UNIQUE index or PRIMARY KEY , MySQL performs an [ UPDATE`]( http://dev.mysql.com/doc/refman/5.7/en/update.html ) de l'ancienne rangée...

El ON DUPLICATE KEY UPDATE peut contenir plusieurs affectations de colonnes, séparées par des virgules.

Avec ON DUPLICATE KEY UPDATE la valeur affected-rows par ligne est de 1 si la ligne est insérée en tant que nouvelle ligne, de 2 si une ligne existante est mise à jour et de 0 si une ligne existante est définie sur ses valeurs actuelles. Si vous spécifiez la valeur CLIENT_FOUND_ROWS pour mysql_real_connect() lors de la connexion à mysqld la valeur de affected-rows est 1 (et non 0) si une ligne existante est définie avec ses valeurs actuelles...

0voto

salfter Points 99

J'ai eu une situation où j'avais besoin de mettre à jour ou d'insérer une table en fonction de deux champs (tous deux des 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 tiré d'une de mes bases de données, les paramètres d'entrée (deux noms et un nombre) étant remplacés par [hasher_name], [hash_name] et [new_value]. Le SELECT...LIMIT 1 imbriqué extrait la première valeur de l'enregistrement existant ou d'un nouvel enregistrement (last_recogs.id est une clé primaire à incrémentation automatique) et l'utilise comme valeur d'entrée dans le REPLACE INTO.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X