2016-10-06 1 views
0

Je voudrais ajouter des lignes à ma table de relations, où de vieilles lignes seront mises à jour et de nouvelles lignes seront ajoutées. Voici ma requête (ID est la seule clé):Comment faire INSERT ... SUR DUPLICATE KEY UPDATE avec des lignes anciennes et nouvelles?

INSERT INTO table_rel (ID, player, team, status) VALUES (1,1,1,0), (2,3,1,1) 
ON DUPLICATE KEY UPDATE status=VALUES(status); 

Que dois-je mettre en place une pièce d'identité dans les lignes qui sont censés être créés? par exemple. (false,2,1,1)

+1

pour auto_incs n'ont tout simplement pas des espaces réservés. ignorer em – Drew

+0

... ou fournir une valeur NULL, soit en utilisant un mot clé NULL, soit une expression qui vaut NULL. Voir ma réponse pour une démonstration. – spencer7593

Répondre

1

S'il s'agit d'une colonne AUTO_INCREMENT, vous pouvez indiquer une valeur NULL. meilleure façon de faire qui est le mot-clé NULL

INSERT INTO table_rel (ID, player, team, status) VALUES 
    (1,1,1,0) 
,(2,3,1,1) 
,(NULL,6,1,0) 
    ^^^^ 

Il y a beaucoup d'autres expressions que vous pouvez utiliser pour retourner une valeur NULL.


démonstration fournissant mot-clé NULL pour la colonne AUTO_INCREMENT, ainsi que d'autres lignes qui ont une valeur non NULL fourni:

CREATE TABLE foo 
(id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY 
, mi VARCHAR(5) 
) ENGINE=INNODB; 
; 

INSERT INTO foo (id, mi) VALUES 
(1,'1') 
,(NULL,'too') 
; 
-- 2 row(s) affected 

INSERT INTO foo (id, mi) VALUES 
(1,'one') 
,(NULL,'three') 
,(2,'two') 
ON DUPLICATE KEY 
UPDATE mi = VALUES(mi) 
; 
-- 5 row(s) affected 

SELECT * FROM foo 
; 
-- id mi 
-- --- ------ 
-- 1 one 
-- 2 two 
-- 3 three 
1

Vous n'en avez pas. Avec:

INSERT INTO table_rel (ID, player, team, status) ... 

vous vous engagez à fournir TOUTES les valeurs énumérées. Puis, avec

... VALUES (1,1,1,0), (2,3,1,1) 
ON DUPLICATE KEY UPDATE status=VALUES(status); 

vous fournissez les valeurs réelles, ID inclus (même pour les nouvelles entrées). Dans ce cas, s'il n'y a pas ID=1 ou ID=2, l'entrée sera créée, sinon les clés dupliquées value seront remplacées.

Une autre solution si vous ne voulez pas spécifier la clé pour les nouvelles entrées, vous devez utiliser une autre instruction (note la colonne manquante):

INSERT INTO table_rel (player, team, status) VALUES (1,1,0), (3,1,1) 

à condition que table_rel a l'option AUTO_INCREMENT sur ID (juste au cas où: ALTER TABLE table_rel MODIFY ID INTEGER NOT NULL AUTO_INCREMENT;).

MISE À JOUR: En se fondant sur AUTO_INCREMENT vous pouvez fournir une NULL clé et laisser le moteur générer une nouvelle clé pour vous. Voir spencer7593's answer pour une description plus complète.

+0

Alors, est-ce que j'omets complètement l'ID? comme dans '(, 1,1,0)' ou dois-je fournir les valeurs avec une colonne manquante '(1,1,0)' et SQL saura que c'est l'ID? La table a autoincrement et je voulais frapper 2 oiseaux avec une pierre –

+0

comme indiqué par @ spencer7593 vous devriez utiliser '(NULL, 1, 1,0)', sinon utiliser la deuxième déclaration avec '(1,1,0) '. '(, 1,1,0)' n'est pas une syntaxe valide. – Batsu