0

MySQL 1062 - Дубликат значения '0' для ключа 'PRIMARY'

9

У меня есть следующая таблица в 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 ответ(ов)

0

Вы забыли добавить AUTO_INCREMENT к вашему первичному полю и вставили данные без идентификатора. Чтобы исправить эту ситуацию, вам нужно будет изменить структуру таблицы, добавив AUTO_INCREMENT к полю id. Вот пример, как это можно сделать:

ALTER TABLE ваша_таблица MODIFY COLUMN id INT AUTO_INCREMENT;

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

0

Вам нужно указать первичный ключ как автоинкремент, чтобы избежать дублирующихся значений. В вашем случае, таблица 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, вам нужно будет сначала очистить данные, чтобы таблица соответствовала требованиям для установки нового первичного ключа.

0

Чтобы проверить, установлен ли для вашего поля с первичным ключом автоинкремент, выполните следующие шаги:

  1. Если вы используете MySQL, запустите команду SHOW CREATE TABLE имя_таблицы;. В результате вы увидите структуру таблицы, где будет указано, если поле имеет атрибут AUTO_INCREMENT.

  2. Также можно использовать следующую команду для получения информации о колонках таблицы:

    SELECT 
        COLUMN_NAME, COLUMN_TYPE, EXTRA 
    FROM 
        information_schema.COLUMNS 
    WHERE 
        TABLE_NAME = 'имя_таблицы' AND 
        COLUMN_KEY = 'PRI';
    

    В результате вы увидите колонку с EXTRA, которая будет содержать значение auto_increment, если автоинкремент включен.

  3. Если вы работаете с другой СУБД, проверьте документацию по работе с автоинкрементом, так как синтаксис может отличаться.

Таким образом, вы сможете подтвердить, что поле с первичным ключом настроено на автоинкремент.

0

Этот шаг отлично сработал для меня. Вы можете попробовать его:

  1. Добавьте индексирование.
  2. Добавьте автонумерацию.
  3. Добавьте первичный ключ.

Надеюсь, это сработает и для вас. Удачи!

0

Чтобы установить 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.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь