# 1062 - Дублирующая запись '1' для ключа 1 - Двойные записи не найдены - PullRequest
9 голосов
/ 03 ноября 2011

Таким образом, при попытке добавить автоинкремент к полю появляется # 1062 - Дублирующая запись '1' для ключа 1. Я попытался удалить первичный ключ и повторно добавить его, и это прекрасно работает (что, я полагаю, не будет, если бы были дубликаты?)

Но когда я пытаюсь добавить автоинкремент к полю, он выдает ошибку. Это дает мне возможность просмотра, которая запускает следующий SQL:

SELECT *
FROM `myTbl`
WHERE CONCAT_WS( "-", 11 ) = "1"
ORDER BY 11
LIMIT 0 , 30

Однако это возвращает пустой результирующий набор .. предполагая, что дубликатов нет. Так что, если нет дубликатов, почему я не могу добавить автоинкремент?

Ответы [ 3 ]

21 голосов
/ 03 ноября 2011

У вас есть строки со значением 0 или NULL для этого столбца? ALTER TABLE может привести к повторному упорядочению первичных ключей. В случае ключа 0 MySQL попытается присвоить ему значение 1, что не удастся, если ключ 1 уже существует.

Попробуйте изменить значения 0 или NULL в столбце на более высокие (и неиспользуемые).

3 голосов
/ 15 августа 2013

Ответ Майкла Миора сработает, если вы сможете изменить данные в таблице.Тем не менее, есть также обходной путь, который позволяет вам сохранить данные нетронутыми (я проверял это на MySQL 5.5).Помните, что нулевое значение в качестве первичного ключа в MySQL не рекомендуется по этой причине.Если вы можете избавиться от нуля, то сделайте это.

Отключите автоматическую генерацию значений при вставке нуля:

SET SQL_MODE=NO_AUTO_VALUE_ON_ZERO;

Добавьте AUTO_INCREMENT в свой столбец:

ALTER TABLE ... AUTO_INCREMENT;

Повторно включить автоматическую генерацию значений:

SET SQL_MODE='';

Должно быть очевидно, что вставка данных в таблицу во время всей этой операции не допускается.В противном случае в столбце появятся нежелательные нулевые значения.

0 голосов
/ 03 ноября 2011
SELECT *                           <<-- Select * is an anti-pattern
FROM myTbl 
WHERE CONCAT_WS( "-", 11 ) = "1"   <<-- You are not selecting a column
ORDER BY 11                        <<-- This however does refer to a column.
LIMIT 30 OFFSET 0

переписать запрос на

SELECT field1, field2, field3, ...., field11
FROM myTbl 
WHERE COALESCE(field1, field2, field3, field11) = '1'
ORDER BY field11               
LIMIT 30 OFFSET 0

Если вы хотите вставить строку, используйте следующий код:

INSERT INTO table1 (/*do not list the PK!*/ field2, field3, field4) 
  VALUES ('a', 'test' ,'b' ,'example'); 

Если вы хотите выбрать все повторяющиеся строки, используйте:

SELECT id, count(*) as duplicate_count
FROM table1
GROUP BY id
HAVING duplicate_count > 1

Вам нужно будет обновить те идентификаторы, которые указаны как дубликаты.

Другой вариант - добавить дополнительный столбец и удалить старый PK.

ALTER TABLE table1 ADD COLUMN new_id unsigned integer not null auto_increment primary key;
ALTER TABLE table1 DROP COLUMN id;
ALTER TABLE table1 CHANGE COLUMN newid id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...