2011-04-28 15 views
5

Tengo una tabla que contiene todo tipo de parámetros. La estructura de la tabla es: Identificación del , object_id, param_name, param_valueMySQL en clave duplicada en un campo no único

El siguiente código funciona, pero añade los resultados en lugar de actualizarlas. El hecho es que no puedo utilizar ON DUPLICATE KEY porque mis campos son los no usuarios únicos (excepto para Identificación por supuesto)

INSERT INTO `params_table` (`object_id`, `param_name`, `param_value`) 
SELECT 
A.id AS my_object_id, 
'XYZ' AS my_param_name, 
IF(TMP.abc IS NULL,0,1) AS my_param_value 
FROM 
ref_table AS A 
LEFT JOIN tmp_table AS TMP ON TMP.abc = A.abc 
ON DUPLICATE KEY 
UPDATE `param_value` = IF(TMP.abc IS NULL,0,1); 
+0

¿Se le permite crear nuevos índices? –

+0

Sí, y ya tengo un índice en object_id – Kounisher

+0

Si desea actualizar un registro en lugar de insertar uno nuevo, significa que es de alguna manera único, tal vez necesita una clave única en un par de columnas (object_id, param_name)? – piotrm

Respuesta

5

La cláusula ON DUPLICATE KEY no sólo funciona en la clave principal:

Si especifica una llave duplicada eN UPDATE y se inserta una fila que causaría un valor duplicado en un índice UNIQUE o una clave principal, un UPDATE de la fila de edad se realiza

Así que a menos que me falta algo obvio sólo hay que crear un índice único en la combinación columna que desea hacer único:

ALTER TABLE params_table 
ADD UNIQUE unique_object_param(object_id,param_name); 
+0

no le gustaría actualizar la columna que es parte de la clave única, si realmente es la clave que se necesita es (object_id, param_name) – piotrm

+0

en mi caso es más como 'ADD UNIQUE foo (object_id, param_name);' Eso debería hacer el truco, gracias – Kounisher

+0

@HurrDurr - He editado mi respuesta para que coincida con su comentario. Por los récords :) –

Cuestiones relacionadas