#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 варианта:
- Обновите таблицу значениями-заполнителями для SSN, которые вы сможете определить позже. Например, одна вещь, которую вы могли бы сделать, это запустить обновление, которое устанавливает столбец ssn = в таблицу pk / id .
- Вместо этого используйте уникальный индекс. Уникальные индексы MySQL игнорируют значение null, но обеспечивают уникальность при добавлении значений. Это также имеет преимущество в обеспечении индексированного поиска, если вы планируете использовать системный поиск по ssn.
Синтаксис будет:
CREATE UNIQUE INDEX physician_ssn_idx ON physician(ssn);
physician_ssn_idx
будет именем вновь созданного индекса, который может быть любым, каким вы хотите, чтобы он был. Если вы создавали индекс / ключ, используя схему именования, вы можете захотеть принять это. В конечном счете, имена индексов вообще не влияют на функциональность, и вам не нужно их знать, чтобы использовать их.