С MySql ALTER IGNORE TABLE
has been deprecated, вы должны фактически удалить дублируемую дату перед добавлением индекса.
Сначала напишите запрос, который находит все дубликаты. Здесь я предполагаю, что email
- это поле, содержащее дубликаты.
SELECT
s1.email
s1.id,
s1.created
s2.id,
s2.created
FROM
student AS s1
INNER JOIN
student AS s2
WHERE
/* Emails are the same */
s1.email = s2.email AND
/* DON'T select both accounts,
only select the one created later.
The serial id could also be used here */
s2.created > s1.created
;
Следующая выбрать только уникальные повторяющиеся идентификаторы:
SELECT
DISTINCT s2.id
FROM
student AS s1
INNER JOIN
student AS s2
WHERE
s1.email = s2.email AND
s2.created > s1.created
;
После того, как вы уверены, что только содержит повторяющиеся идентификаторы, которые вы хотите удалить, запустить удаление. Вы должны добавить (SELECT * FROM tblname)
, чтобы MySql не жаловался.
DELETE FROM
student
WHERE
id
IN (
SELECT
DISTINCT s2.id
FROM
(SELECT * FROM student) AS s1
INNER JOIN
(SELECT * FROM student) AS s2
WHERE
s1.email = s2.email AND
s2.created > s1.created
);
Затем создайте уникальный индекс:
ALTER TABLE
student
ADD UNIQUE INDEX
idx_student_unique_email(email)
;
Это отличный способ! – nc3b
Это очень умно. – 2010-05-20 14:24:34
Не работал для меня. (ошибка выполнения дублирования запроса) – Noam