Мне нужен оператор update
чтобы решить некоторые проблемы с дубликатами в таблице на MySQL. Структура таблицы показана ниже. Мне нужен оператор MySQL, который установит значение дубликата как NULL
кроме первого, то есть с самым низким идентификатором. Здесь идентификатор является первичным ключом.
Это пример того, что у меня есть:
id name
1 foo
2 foo
3 bar
4 NULL
5 NULL
6 foo
7 bar
Это желаемый результат:
id name
1 foo
2 NULL
3 bar
4 NULL
5 NULL
6 NULL
7 NULL
В таблице есть другие столбцы с полезной информацией. Следовательно, строка не может быть просто удалена.
Я бы написал это так:
UPDATE t JOIN
(SELECT name, MIN(id) as min_id
FROM t
GROUP BY name
) tt
ON t.name = tt.name and t.id > tt.min_id
SET t.name = NULL;
Я думаю, что логика легче следовать с помощью JOIN
. В основном, это говорит, чтобы найти минимальный идентификатор для каждого name
. Затем установите все остальные строки с тем же name
в NULL
.
UPDATE t JOIN
(SELECT name, MIN(id) as min_id
FROM t
WHERE name IS NOT NULL
GROUP BY name
HAVING COUNT(*) > 1
) tt
ON t.name = tt.name and t.id > tt.min_id
SET t.name = NULL;
Ваш запрос UPDATE
может включать в себя JOIN
.
например, присоедините минимальный идентификатор для каждого имени и обновляйте только тогда, когда идентификатор не является минимальным.
UPDATE
t
LEFT OUTER JOIN (
SELECT
MIN(id) AS id
FROM
t
GROUP BY
name
) t1 ON t.id = t1.id
SET
t.name = NULL
WHERE
t1.id IS NULL