Подтвердить что ты не робот

MySQL alter table изменить колонку с ошибкой в ​​строках с нулевыми значениями

У меня есть таблица размером около 10 тыс. строк, которую я пытаюсь изменить, так что поле fielddelimiter никогда не является нулевым. Я пытаюсь сделать выражение alter, ожидая, что любые значения NULL будут изменены на значение по умолчанию, но я получаю сообщение об ошибке из инструкции sql.

alter table merchant_ftp_account modify column `fielddelimiter` char(1) NOT NULL DEFAULT 't';

17:08:48  [ALTER - 0 row(s), 0.000 secs]  [Error Code: 1265, SQL State: 01000]  Data truncated for column 'fielddelimiter' at row 3987
... 1 statement(s) executed, 0 row(s) affected, exec/fetch time: 0.000/0.000 sec  [0 successful, 0 warnings, 1 errors]

Как я понимаю, это означает, что данные превышают размер поля в этой строке, но (а) данные в этом поле (нуль) в этой строке и (б) я могу обновить эту строку непосредственно с помощью значение 't', и я не получаю ошибку усечения. Если я обновляю эту строку с ненулевым значением и попытаюсь повторно запустить оператор alter, он не будет работать в следующей строке, где fielddelimiter имеет значение null. [ETA: Я понимаю, что MySQL может обновляться в любом направлении, но я могу отслеживать его прогресс по мере изменения строк.]

В документах MySQL есть предупреждение:

Warning This conversion may result in alteration of data. For example, if you shorten a
string column, values may be truncated. To prevent the operation from succeeding if
conversions to the new data type would result in loss of data, enable strict SQL mode
before using ALTER TABLE (see Section 5.1.6, "Server SQL Modes").

Но значения, которые он якобы усекают, являются нулями. Может ли кто-нибудь объяснить мне, что здесь происходит? И как его решить?

[ETA: существующее определение поля fielddelimiter char (1) (разрешает null, значение по умолчанию), поэтому оно не должно иметь значений > 1 char, а выбор подтверждает, что это не так. Различными значениями в поле являются NULL, '' (пустая строка), 'p', 't' и 'y'.]

4b9b3361

Ответ 1

Я только что столкнулся с этой ошибкой, и кажется, что решение заключалось в использовании оператора IGNORE:

ALTER IGNORE TABLE `table` CHANGE COLUMN `col` `col` int(11) NOT NULL;

Обратите внимание, что у вас могут быть проблемы с усечением данных, поэтому убедитесь, что это желаемый результат. Используя оператор IGNORE, он будет подавлять усеченные ошибки данных для значений NULL в столбцах (и, возможно, других ошибках!!!)

Ответ 2

Если ваш столбец имеет значения NULL, вы не можете изменить его как "NON NULL". Сначала измените значения NULL на что-то еще, а затем попробуйте.

Ответ 3

Сначала удалите все нулевые значения

UPDATE merchant_ftp_account SET fielddelimiter='t' WHERE fielddelimiter IS NULL;

Тогда

ALTER TABLE merchant_ftp_account MODIFY COLUMN `fielddelimiter` char(1) NOT NULL DEFAULT 't';