2009-01-16 12 views
59

Quiero hacer algo como estoINSERT INTO .. ​​EN DUPLICADO KEY UPDATE por varios elementos,

INSERT INTO t (t.a, t.b, t.c) 
VALUES ('key1','key2','value') 
ON DUPLICATE KEY UPDATE 
t.c = 'value'; 
INSERT INTO t (t.a, t.b, t.c) 
VALUES ('key1','key3','value2') 
ON DUPLICATE KEY UPDATE 
t.c = 'value2'; 

t.a y t.b son claves. Todo esto funciona bien pero recibo un error en el segundo inserto. Con phpMyAdmin, una consulta como esta funciona bien, pero supongo que está ejecutando las consultas de forma independiente, ya que imprime los resultados de esa consulta como comentarios.

Algo como esto sería bueno también, pero tendré que tener diferentes valores para cada artículo. Prefiero esto, pero no estoy seguro de cómo puedo cambiar el valor de la actualización para cada valor.

INSERT INTO t (t.a, t.b, t.c) 
VALUES ('key1','key2','value'), ('key1','key3','value2') 
ON DUPLICATE KEY UPDATE 
t.c = ??? 

el problema está en los signos de interrogación, lo que debo poner allí para que cada inserción/actualización tendrá el valor correcto? Obviamente, si pongo un valor, todos los campos obtendrán ese valor.

Si hay otra manera de hacer una "actualización si existe, de lo contrario inserte" la consulta en múltiples campos con dos claves, también estoy preparado para otras ideas. Supongo que podría ejecutar cada consulta por separado (como phpMyAdmin?) Pero va a haber muchas consultas, así que realmente quiero evitar eso.

Respuesta

139

utilizar los valores de() de función

INSERT INTO t (t.a, t.b, t.c) 
VALUES ('key1','key2','value'), ('key1','key3','value2') 
ON DUPLICATE KEY UPDATE 
t.c = VALUES(t.c) 

ver http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

+2

Brilliant! Y maldito sea SQL por ser tan poco intuitivo ... – pixelfreak

+2

mysql> INSERT INTO param (id, num) VALUES (3,4) EN DUPLICATE KEY UPDATE id = VALUES ( d) +222; Consulta OK, 2 filas afectadas (0,67 seg) – zloctb

36

demasiado bajo en representante para hacer comentarios, pero quería añadir una sintaxis un poco más complejo que fue inspirado por @ ʞɔıu respuesta. Para actualizar varios campos de clave duplicada:

INSERT INTO t (t.a, t.b, t.c, t.d) 
VALUES ('key1','key2','value','valueb'), ('key1','key3','value2','value2b') 
ON DUPLICATE KEY UPDATE 
t.c = VALUES(t.c), 
t.d = VALUES(t.d) 

la esperanza de que ayude a alguien por ahí buscando a realizar operaciones de inserción a granel con múltiples en la actualización de clave duplicada. La sintaxis se me escapó.

Cuestiones relacionadas