Ошибка дублирования записи при попытке добавить уникальное ограничение в table.column в MySQL

#mysql #constraints #unique

#mysql #ограничения #уникальный

Вопрос:

Как говорится в названии, я получаю следующую ошибку при вставке этого запроса в клиент командной строки MySQL

Запрос

ИЗМЕНИТЬ ТАБЛИЦУ и ДОБАВИТЬ УНИКАЛЬНЫЙ (ssn);

Код ошибки

ОШИБКА 1062 (23000): дубликат записи » для ключа ‘physician.ssn’

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

Ответ №1:

Он говорит вам, что он не может добавить это уникальное ограничение. Причина в том, что в таблице physician уже есть записи с одинаковыми значениями SSN. Вы можете удалить эти повторяющиеся записи, а затем запустить свой оператор ALTER.

Комментарии:

1. Можно ли в любом случае добавить уникальное ограничение к существующему столбцу SSN без удаления записей? Мой столбец SSN на самом деле не имеет никаких значений, но для него просто установлено значение NULL.

2. Боюсь, что нет. В любом случае не должно быть 2 врачей с одинаковым SSN.

Ответ №2:

Уникальное ограничение допускает только уникальные значения для этого столбца. Поскольку у вас уже есть много строк с NULL, MySQL не позволит вам добавить ограничение.

У вас есть 2 варианта:

  1. Обновите таблицу значениями-заполнителями для SSN, которые вы сможете определить позже. Например, одна вещь, которую вы могли бы сделать, это запустить обновление, которое устанавливает столбец ssn = в таблицу pk / id .
  2. Вместо этого используйте уникальный индекс. Уникальные индексы MySQL игнорируют значение null, но обеспечивают уникальность при добавлении значений. Это также имеет преимущество в обеспечении индексированного поиска, если вы планируете использовать системный поиск по ssn.

Синтаксис будет:

 CREATE UNIQUE INDEX physician_ssn_idx ON physician(ssn);
  

physician_ssn_idx будет именем вновь созданного индекса, который может быть любым, каким вы хотите, чтобы он был. Если вы создавали индекс / ключ, используя схему именования, вы можете захотеть принять это. В конечном счете, имена индексов вообще не влияют на функциональность, и вам не нужно их знать, чтобы использовать их.