#1062-дубликат записи "для ключа" уникальный идентификатор " при попытке добавить уникальный ключ (MySQL)

у меня есть ошибка в MySQL при попытке добавить уникальный ключ. Вот что я пытаюсь сделать. У меня есть столбец под названием "unique_id", который является VARCHAR(100). В таблице не определены индексы. Я получаю эту ошибку:

#1062 - Duplicate entry '' for key 'unique_id' 

когда я пытаюсь добавить уникальный ключ. Вот скриншот того, как я настраиваю его в phpMyAdmin:

enter image description here

вот запрос MySQL, который генерируется phpMyAdmin:

ALTER TABLE  `wind_archive` ADD  `unique_id` VARCHAR( 100 ) NOT NULL FIRST ,
ADD UNIQUE (
`unique_id`
)

у меня была эта проблема в прошлом и никогда не разрешал его, поэтому я просто перестроил таблицу с нуля. К сожалению, в этом случае я не могу этого сделать, так как в таблице уже много записей. Спасибо за помощь!

6 ответов


ошибка говорит все это:

Duplicate entry '' 

поэтому выполните следующий запрос:

SELECT unique_id,COUNT(unique_id)
FROM yourtblname
GROUP BY unique_id
HAVING COUNT(unique_id) >1

этот запрос также покажет вам проблему

SELECT *
FROM yourtblname
WHERE unique_id=''

Это покажет вам, где есть значения, которые имеют дубликаты. Вы пытаетесь создать уникальный индекс для поля с дубликатами. Сначала вам нужно будет разрешить дубликаты данных, а затем добавить индекс.


это 3-й раз, когда я ищу решение этой проблемы, поэтому для справки я размещаю ответ здесь.

в зависимости от данных мы можем использовать ключевое слово IGNORE с командой Alter. Если указан параметр игнорировать, то из строк с дубликатами на уникальном ключе используется только первая строка, остальные конфликтующие строки удаляются. Неправильные значения усекаются до ближайшего приемлемого значения соответствия.

на IGNORE расширение ключевого слова для MySQL, похоже, имеет ошибка в InnoDB в версии на какой-то версии MySQL.

вы всегда можете конвертировать в MyISAM, игнорировать-добавить индекс, а затем конвертировать обратно в InnoDB

ALTER TABLE table ENGINE MyISAM;
ALTER IGNORE TABLE table ADD UNIQUE INDEX dupidx (field);
ALTER TABLE table ENGINE InnoDB;

Примечание. Если у вас есть ограничения внешнего ключа, это не сработает, вам придется сначала удалить их и добавить их позже.


сделать unique_id NULL С NOT NULL и это решит вашу проблему


select ID from wind_archive 
where ID not in (select max(ID) from wind_archive group by unique_id) 

и это то, что вы должны удалить из стола перед Вы успешно добавить уникальный ключ. это также работает для добавления уникального ключа с 2 или более столбцов. такие, как ... --3-->

delete from wind_archive 
where ID in (
select * from (select ID from wind_archive where ID not in (
select max(ID) from wind_archive group by lastName, firstName
) ORDER BY ID
) AS p
);

Я получал ту же ошибку (дубликат записи " для ключа "unique_id") при попытке добавить новый столбец как уникальный "после" я уже создал таблицу, содержащую только имена музеев. Я хотел вернуться и добавить уникальный код для каждого названия музея, с намерением вставлять значения кода по одному. Плохое планирование стола с моей стороны. Мое решение состояло в том, чтобы добавить новый столбец, не делая его уникальным; затем введите данные для каждого кода по одной строке за раз; а затем измените структура столбцов, чтобы сделать ее уникальной для будущих записей. Повезло, что было всего 10 рядов.


из-за того, что вы пишете в своем запросе, unique_id не будет NULL и предыдущие строки все из них равны null и вы хотите, чтобы этот столбец был уникальным, то после запуска этого запроса у вас есть несколько строк с тем же значением это означает, что этот столбец не уникален, то вы должны изменить unique_id не NULL на unique_id NULL в вашем запросе.