J'ai cherché mais je n'ai pas trouvé si c'était 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)
L'identifiant de champ a un "index unique", il ne peut donc pas y en avoir deux. Maintenant, si le même identifiant est déjà présent dans la base de données, 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 tout spécifié déjà dans l'insert ...
Une note supplémentaire, j'aimerais utiliser le travail autour pour obtenir l'ID!
id=LAST_INSERT_ID(id)
J'espère que quelqu'un pourra me dire quelle est la manière la plus efficace.
a=VALUES(a), b=VALUES(b), ...
est la voie à suivre. C'est comme ça que je fais pour toutes mesINSERT ON DUPLICATE KEY UPDATE
déclarations.Réponses:
L'
UPDATE
instruction est donnée afin que les champs plus anciens puissent être mis à jour avec une nouvelle valeur. Si vos anciennes valeurs sont les mêmes que vos nouvelles, pourquoi auriez-vous besoin de les mettre à jour dans tous les cas?Pour par exemple. si vos colonnes
a
àg
sont déjà définies comme2
à8
; il ne serait pas nécessaire de le remettre à jour.Alternativement, vous pouvez utiliser:
Pour obtenir le
id
deLAST_INSERT_ID
; vous devez spécifier l'application backend que vous utilisez pour la même chose.Pour LuaSQL, a
conn:getlastautoid()
récupère la valeur.la source
tbl
déjà la ligne (1,10), alors:INSERT INTO tbl(id, a) VALUES(1,2) ON DUPLICATE KEY UPDATE a=VALUES(a)
définira a = 2 . Alors queINSERT INTO tbl(id, a) VALUES(1,2) ON DUPLICATE KEY UPDATE a=a
mettra un = 10a=a
aucune mise à jour. (Les requêtes de la question d'origine ne mettent pas à jour non plus, mais une mise à jour semble être ce que le PO voulait.)Il existe une extension spécifique à MySQL pour SQL qui peut être ce que vous voulez -
REPLACE INTO
Cependant, cela ne fonctionne pas tout à fait de la même manière que 'ON DUPLICATE UPDATE'
Il supprime l'ancienne ligne qui entre en conflit avec la nouvelle ligne, puis insère la nouvelle ligne. Tant que vous n'avez pas de clé primaire sur la table, ce serait bien, mais si vous le faites, alors si une autre table fait référence à cette clé primaire
Vous ne pouvez pas référencer les valeurs des anciennes lignes, vous ne pouvez donc pas faire l'équivalent de
Cela devrait fonctionner - last_insert_id () doit avoir la valeur correcte tant que votre clé primaire s'incrémente automatiquement.
Cependant, comme je l'ai dit, si vous utilisez réellement cette clé primaire dans d'autres tables,
REPLACE INTO
cela ne vous sera probablement pas acceptable, car cela 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:
la source
replace into
requête?Il n'y a pas d'autre moyen, je dois tout spécifier deux fois. Premièrement pour l'insert, deuxième dans le cas de la mise à jour.
la source
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 aspect simple.
Suivez ces étapes: Apprenez d'une solution simple.
Étape 1: Créez un schéma de table à l' aide de cette requête SQL:
Étape 2: Créez un index de deux colonnes pour éviter les données en double à l'aide de la requête SQL suivante:
ou, créez un index de deux colonnes à partir de l'interface graphique comme suit:
Étape 3: Mettre à jour s'il existe, insérer si vous n'utilisez pas les requêtes suivantes:
la source
Juste au cas où vous pourriez utiliser un langage de script pour préparer vos requêtes SQL, vous pouvez réutiliser des paires champ = valeur en utilisant
SET
au lieu de(a,b,c) VALUES(a,b,c)
.Un exemple avec PHP:
Exemple de tableau:
la source
Vous voudrez peut-être envisager d'utiliser la
REPLACE INTO
syntaxe, mais soyez averti, lors de la duplication de la clé PRIMAIRE / UNIQUE, elle SUPPRIME la ligne et EN INSERTE une nouvelle.Vous n'aurez pas besoin de redéfinir tous les champs. Cependant, vous devez envisager la réduction des performances possible (dépend de la conception de votre table).
Mises en garde:
la source
Je sais qu'il est tard, mais j'espère que quelqu'un sera aidé de cette réponse
Vous pouvez lire le tutoriel ci-dessous ici:
la source
new
:INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) AS new ON DUPLICATE KEY UPDATE c = new.a+new.b;
vous pouvez utiliser insert ignore dans ce cas, il ignorera s'il obtient des enregistrements en double INSERT IGNORE ...; - sans clé ON DUPLICATE
la source