Mise à jour de la clé en double identique à celle de l’insertion

J’ai cherché autour mais je n’ai pas trouvé si c’est possible.

J’ai cette requête MySQL:

INSERT INTO table (id,a,b,c,d,e,f,g) VALUES (1,2,3,4,5,6,7,8) 

Le champ id a un “index unique”, il ne peut donc y en avoir deux. Maintenant, si le même identifiant est déjà présent dans la firebase database, j’aimerais le mettre à jour. Mais dois-je vraiment spécifier à nouveau tous ces champs, comme:

 INSERT INTO table (id,a,b,c,d,e,f,g) VALUES (1,2,3,4,5,6,7,8) ON DUPLICATE KEY UPDATE a=2,b=3,c=4,d=5,e=6,f=7,g=8 

Ou:

 INSERT INTO table (id,a,b,c,d,e,f,g) VALUES (1,2,3,4,5,6,7,8) ON DUPLICATE KEY UPDATE a=VALUES(a),b=VALUES(b),c=VALUES(c),d=VALUES(d),e=VALUES(e),f=VALUES(f),g=VALUES(g) 

J’ai déjà tout spécifié dans l’insert …

Une note supplémentaire, je voudrais utiliser le travail autour pour obtenir l’ID!

 id=LAST_INSERT_ID(id) 

J’espère que quelqu’un peut me dire quel est le moyen le plus efficace.

L’instruction UPDATE est donnée pour que les anciens champs puissent être mis à jour avec une nouvelle valeur. Si vos anciennes valeurs sont identiques à vos nouvelles valeurs, pourquoi devriez-vous les mettre à jour dans tous les cas?

Par exemple si vos colonnes a à g sont déjà définies comme 2 à 8 ; il ne serait pas nécessaire de le mettre à jour.

Alternativement, vous pouvez utiliser:

 INSERT INTO table (id,a,b,c,d,e,f,g) VALUES (1,2,3,4,5,6,7,8) ON DUPLICATE KEY UPDATE a=a, b=b, c=c, d=d, e=e, f=f, g=g; 

Pour obtenir l’ id de LAST_INSERT_ID ; vous devez spécifier l’application backend que vous utilisez pour la même chose.

Pour LuaSQL, un conn:getlastautoid() récupère la valeur.

Il existe une extension spécifique à SQL pour SQL qui peut être ce que vous voulez – REPLACE INTO

Cependant, cela ne fonctionne pas de la même manière que “ON DUPLICATE UPDATE”

  1. Il supprime l’ancienne ligne en conflit avec la nouvelle ligne, puis insère la nouvelle ligne. Tant que vous n’avez pas de clé primaire sur la table, cela serait correct, mais si vous le faites, alors si une autre table fait référence à cette clé primaire

  2. Vous ne pouvez pas référencer les valeurs dans les anciennes lignes, vous ne pouvez donc pas faire l’équivalent de

     INSERT INTO mytable (id, a, b, c) values ( 1, 2, 3, 4) ON DUPLICATE KEY UPDATE id=1, a=2, b=3, c=c + 1; 

Je voudrais utiliser le travail autour pour obtenir l’ID à!

Cela devrait fonctionner – last_insert_id () devrait avoir la valeur correcte tant que votre clé primaire est auto-incrémentée.

Cependant, comme je l’ai dit, si vous utilisez réellement cette clé primaire dans d’autres tables, REPLACE INTO ne sera probablement pas acceptable pour vous, car elle supprime l’ancienne ligne qui s’est heurtée via la clé unique.

Quelqu’un d’autre a suggéré avant de pouvoir réduire la saisie en faisant:

 INSERT INTO `tableName` (`a`,`b`,`c`) VALUES (1,2,3) ON DUPLICATE KEY UPDATE `a`=VALUES(`a`), `b`=VALUES(`b`), `c`=VALUES(`c`); 

Il n’y a pas d’autre moyen, je dois tout spécifier deux fois. D’abord pour l’insertion, deuxièmement dans le cas de la mise à jour.

Voici une solution à votre problème:

J’ai essayé de résoudre un problème comme le vôtre et je veux suggérer de tester d’un simple aspect.

Suivez ces étapes: Apprenez de la solution simple.

Étape 1: Créez un schéma de table à l’ aide de cette requête SQL:

 CREATE TABLE IF NOT EXISTS `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(30) NOT NULL, `password` varchar(32) NOT NULL, `status` tinyint(1) DEFAULT '0', PRIMARY KEY (`id`), UNIQUE KEY `no_duplicate` (`username`,`password`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1; 

Une table <code/> utilisateur </ code> avec des données”> </p>
<p>  Étape 2: <strong>Créez un index de deux colonnes</strong> pour empêcher la duplication de données à l’aide de la requête SQL suivante: </p>
<pre> <code>ALTER TABLE `user` ADD INDEX no_duplicate (`username`, `password`);</code> </pre>
<p>  ou <strong>Créez un index de deux colonnes à partir de l’interface graphique</strong> comme suit: <img src= Sélectionner des colonnes pour créer un index Index de la table <code/> user </ code>“> </p>
<p>  Étape 3: <strong>mise à jour, le cas échéant, insérez si vous</strong> n’utilisez <strong>pas</strong> les requêtes suivantes: </p>
<pre> <code>INSERT INTO `user`(`username`, `password`) VALUES ('ersks','Nepal') ON DUPLICATE KEY UPDATE `username`='master',`password`='Nepal'; INSERT INTO `user`(`username`, `password`) VALUES ('master','Nepal') ON DUPLICATE KEY UPDATE `username`='ersks',`password`='Nepal';</code> </pre>
<p> <img src=

Juste au cas où vous seriez capable d’utiliser un langage de script pour préparer vos requêtes SQL, vous pourriez réutiliser des paires field = value en utilisant SET au lieu de (a,b,c) VALUES(a,b,c) .

Un exemple avec PHP:

 $pairs = "a=$a,b=$b,c=$c"; $query = "INSERT INTO $table SET $pairs ON DUPLICATE KEY UPDATE $pairs"; 

Exemple de tableau:

 CREATE TABLE IF NOT EXISTS `tester` ( `a` int(11) NOT NULL, `b` varchar(50) NOT NULL, `c` text NOT NULL, UNIQUE KEY `a` (`a`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

Vous pouvez envisager d’utiliser la syntaxe REPLACE INTO , mais soyez averti, lors de la duplication de la clé PRIMARY / UNIQUE, elle supprime la ligne et en insère une nouvelle.

Vous n’avez pas besoin de spécifier à nouveau tous les champs. Cependant, vous devriez envisager la réduction possible des performances (dépend de la conception de votre table).

Mises en garde:

  • Si vous avez la clé primaire AUTO_INCREMENT, il en recevra une nouvelle
  • Les index devront probablement être mis à jour

vous pouvez utiliser insert ignore pour un tel cas, il ignorera s’il obtient des enregistrements en double INSERT IGNORE …; – sans la clé ON DUPLICATE