MySQL 1062 - Дубликат значения '0' для ключа 'PRIMARY'
У меня есть следующая таблица в MySQL версии 5.5.24:
DROP TABLE IF EXISTS `momento_distribution`;
CREATE TABLE IF NOT EXISTS `momento_distribution`
(
`momento_id` INT(11) NOT NULL,
`momento_idmember` INT(11) NOT NULL,
`created_at` DATETIME DEFAULT NULL,
`updated_at` DATETIME DEFAULT NULL,
`unread` TINYINT(1) DEFAULT '1',
`accepted` VARCHAR(10) NOT NULL DEFAULT 'pending',
`ext_member` VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (`momento_id`, `momento_idmember`),
KEY `momento_distribution_FI_2` (`momento_idmember`),
KEY `accepted` (`accepted`, `ext_member`)
)
ENGINE=InnoDB
DEFAULT CHARSET=latin1;
В этой таблице содержится много данных с отношениями многие-ко-многим с двумя другими таблицами, в которых установлены ограничения ondelete=restrict
и onupdate=restrict
.
Теперь мне нужно изменить структуру и ввести отдельный первичный ключ в таблице, сохранив при этом существующие связи и данные. Для этого я выполнил следующий запрос:
ALTER TABLE `momento_distribution` ADD `id` INT(11) NOT NULL FIRST;
ALTER TABLE `momento_distribution` DROP PRIMARY KEY, ADD PRIMARY KEY (`id`);
К сожалению, мой второй запрос завершился ошибкой:
1062 - Duplicate entry '0' for key 'PRIMARY'
Не подскажете, в чем проблема? Я предполагаю, что дело в существующих отношениях, но не хочу терять имеющиеся связи или данные, у меня несколько тысяч строк. Есть ли способ сделать это без потери данных?
ПРАЗДНИК: После просмотра данных я увидел, что в недавно созданном столбце значение равно '0'. Вероятно, это и не позволяет изменить первичный ключ из-за дублирующихся записей (в новом первичном ключе).
У меня больше 8000 строк, поэтому я не могу изменить их вручную. Есть ли способ присвоить rowid
в новый первичный ключ?
5 ответ(ов)
Вы забыли добавить AUTO_INCREMENT к вашему первичному полю и вставили данные без идентификатора. Чтобы исправить эту ситуацию, вам нужно будет изменить структуру таблицы, добавив AUTO_INCREMENT к полю id
. Вот пример, как это можно сделать:
ALTER TABLE ваша_таблица MODIFY COLUMN id INT AUTO_INCREMENT;
После этого вы сможете вставлять новые записи, не указывая id
, и значение будет автоматически увеличиваться. Если у вас уже есть существующие записи без идентификатора, вам нужно будет добавить уникальные значения для этих записей вручную, либо удалить их перед изменением структуры таблицы.
Вам нужно указать первичный ключ как автоинкремент, чтобы избежать дублирующихся значений. В вашем случае, таблица momento_distribution
уже имеет составной первичный ключ из двух столбцов: momento_id
и momento_idmember
, что значит, что оба столбца вместе создают уникальное значение, но momento_id
не является автоинкрементным.
Если вы хотите сделать momento_id
автоинкрементным и единственным первичным ключом, вам нужно будет изменить структуру таблицы. Вот пример того, как вы можете это сделать:
ALTER TABLE `momento_distribution`
DROP PRIMARY KEY,
ADD COLUMN `id` INT(11) NOT NULL AUTO_INCREMENT FIRST,
ADD PRIMARY KEY (`id`);
В этом примере мы добавляем новый столбец id
, который будет автоинкрементным, и устанавливаем его в качестве нового первичного ключа. Затем старый первичный ключ удаляется. Обратите внимание, что в этом случае может потребоваться обновить все ваши запросы, чтобы учитывать новый столбец id
вместо старого составного ключа.
Также стоит отметить, что если в таблице уже есть дублирующиеся значения для momento_id
и momento_idmember
, вам нужно будет сначала очистить данные, чтобы таблица соответствовала требованиям для установки нового первичного ключа.
Чтобы проверить, установлен ли для вашего поля с первичным ключом автоинкремент, выполните следующие шаги:
Если вы используете MySQL, запустите команду
SHOW CREATE TABLE имя_таблицы;
. В результате вы увидите структуру таблицы, где будет указано, если поле имеет атрибутAUTO_INCREMENT
.Также можно использовать следующую команду для получения информации о колонках таблицы:
SELECT COLUMN_NAME, COLUMN_TYPE, EXTRA FROM information_schema.COLUMNS WHERE TABLE_NAME = 'имя_таблицы' AND COLUMN_KEY = 'PRI';
В результате вы увидите колонку с
EXTRA
, которая будет содержать значениеauto_increment
, если автоинкремент включен.Если вы работаете с другой СУБД, проверьте документацию по работе с автоинкрементом, так как синтаксис может отличаться.
Таким образом, вы сможете подтвердить, что поле с первичным ключом настроено на автоинкремент.
Этот шаг отлично сработал для меня. Вы можете попробовать его:
- Добавьте индексирование.
- Добавьте автонумерацию.
- Добавьте первичный ключ.
Надеюсь, это сработает и для вас. Удачи!
Чтобы установить PRIMARY KEY с автоинкрементом, вы можете использовать следующий синтаксис при создании таблицы в SQL:
CREATE TABLE имя_таблицы (
id INT AUTO_INCREMENT PRIMARY KEY,
другое_поле VARCHAR(255) NOT NULL
);
В этом примере поле id
служит PRIMARY KEY и будет автоматически увеличиваться при добавлении новых записей в таблицу. Не забудьте заменить имя_таблицы
на название вашей таблицы и добавить любые дополнительные поля, которые вам нужны. Если таблица уже существует, вы можете изменить существующее поле следующим образом:
ALTER TABLE имя_таблицы MODIFY COLUMN id INT AUTO_INCREMENT;
Тем не менее, убедитесь, что данное поле уже установлено как PRIMARY KEY.
Присоединение против подзапроса: что выбрать?
SQL: выбрать только строки с максимальным значением в столбце
Когда использовать одинарные кавычки, двойные кавычки и обратные кавычки в MySQL
Удаление с использованием JOIN в MySQL
java.sql.SQLException: Не найден подходящий драйвер для jdbc:mysql://localhost:3306/dbname