MySQL alter table modify列在具有空值的行中失败

bar*_*lay 11 mysql

我有一个大约10K行的表,我试图改变,以便该字段fielddelimiter永远不为空.我试图做一个alter语句,期望将任何空值更改为默认值,但是我从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]
Run Code Online (Sandbox Code Playgroud)

据我所知,这意味着数据超过了该行的字段大小,但是(a)该行中的数据是(null),并且(b)我能够直接用值'更新该行' t',我没有得到截断错误.如果我使用非fielddelimiter空值更新该行并尝试重新运行alter语句,则会在下一行为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”).
Run Code Online (Sandbox Code Playgroud)

但它被认为截断的值是空值.任何人都可以向我解释这里发生了什么吗?以及如何解决?

[ETA:现有的fielddelimiter字段定义是char(1)(允许空值,没有默认值),因此它不应该具有> 1 char的值,并且select确认它不是.字段中的不同值为NULL,''(空字符串),'p','t'和'y'.]

小智 7

如果列具有NULL值,则不能将其更改为"NON NULL".首先将NULL值更改为其他值,然后尝试它.

  • +1这似乎是我的MySQL设置的正确答案(我认为这是服务器的默认设置)我只是通过在调用alter table表达式之前设置默认值来设法修复"损坏的"数据库. (3认同)

Sim*_*mon 6

我刚刚遇到这个错误,似乎解决方案是使用IGNORE语句:

ALTER IGNORE TABLE `table` CHANGE COLUMN `col` `col` int(11) NOT NULL;
Run Code Online (Sandbox Code Playgroud)

请注意,您可能仍然存在数据截断问题,因此请确保这是所需的结果.使用IGNORE语句,它将抑制列中NULL值的数据截断错误(可能还有其他错误!!!)

  • 绝对不推荐"ALTER IGNORE"! (3认同)
  • 这可能会解决部分问题,但我不能在生产数据集上这样做...(我刚刚在我正在处理的数据库中遇到原始海报的问题,我有大约10k行,但没有减速做更新) (2认同)