MySQL на дубликате ключа на неуникальном поле - PullRequest
5 голосов
/ 28 апреля 2011

У меня есть таблица, содержащая все виды параметров. Структура таблицы: id, идентификатор_объекта, имя_параметра, значение_параметра

Следующий код работает, но добавляет результаты вместо их обновления. Дело в том, что я не могу использовать ON DUPLICATE KEY , потому что мои поля не уникальны (за исключением id конечно)

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);

1 Ответ

6 голосов
/ 28 апреля 2011

Предложение ON DUPLICATE KEY работает не только с первичным ключом:

Если вы укажете ON DUPLICATE KEY ОБНОВЛЕНИЕ, и вставлена ​​строка, которая приведет к дублированию значения в УНИКАЛЬНЫЙ ИНДЕКС или ПЕРВИЧНЫЙ КЛЮЧ, ОБНОВЛЕНИЕ старого ряда исполняется

Поэтому, если я не упускаю что-то очевидное, вам просто нужно создать уникальный индекс для комбинации столбцов, которую вы хотите сделать уникальной:

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