Ошибка MySQL 1062 во время изменения столбца изменения таблицы - PullRequest
0 голосов
/ 03 января 2019

У меня есть таблица, которая выглядит следующим образом:

CREATE TABLE t1 (
    id BIGINT AUTO_INCREMENT NOT NULL PRIMARY KEY, 
    col1 VARCHAR(256),
    UNIQUE INDEX t1_col1_index (col1)
)

Я пытаюсь изменить тип col1, используя следующий запрос:

ALTER TABLE t1 MODIFY COLUMN col1 varchar(191) COLLATE utf8mb4_unicode_ci;

Однако я сталкиваюсь с этимошибка дублирования:

ошибка: («1062», «QMYSQL3: невозможно выполнить оператор», «Дублирующая запись« +123456789 »для ключа« t1_col1_index »»)

Сначала я думал, что это может быть потому, что две или более строки могут «содержать» одинаковое значение для col1, и при изменении длины varchar данные усекаются, но потом я обнаружил, что урезание данных даже не позволяет выполнить запрос.Любые указатели на то, что может быть причиной этого?

РЕДАКТИРОВАТЬ (решено): Усечение происходит, когда @@ sql_mode не установлен с STRICT_TRANS_TABLES.Это было причиной ошибки.

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Вы уменьшаете длину столбца varchar, который контролируется ограничением UNIQUE.

Это рискованный бизнес.Данные негабаритного размера будут безрезультатно обрезаться (если только для @@sql_mode не установлено значение STRICT_TRANS_TABLES, в этом случае возникнет ошибка).Это, вероятно, генерирует дубликаты, которые вызывают ошибку, вызванную вашим UNIQUE ограничением.

Вы можете проверить максимальную длину значений в вашем столбце с помощью:

SELECT MAX(CHAR_LENGTH(col1)) FROM t1:
0 голосов
/ 03 января 2019

Я не уверен, работает ли это.

Попробуйте проверить таблицу t1.

select count(1) from t1 where col1 = 123456789

Теперь, если число больше одного, попробуйте удалить другое.и оставьте только одну запись.

Затем попробуйте снова выполнить свое утверждение.

Напоминание: сначала выполните back up перед удалением.

...