我有一个大约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]
据我所知,这意味着数据超出了此行的字段大小,但是(a)该行中的数据是(null),并且(b)我能够直接更新该行值't',我没有得到截断错误。如果我使用非空值更新该行并尝试重新运行alter语句,则会在fielddelimiter
为空的下一行失败。 [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)(允许空值,无默认值),因此它不应具有值> 1个字符,并且选择确认它没有。字段中的不同值为NULL,''(空字符串),'p','t'和'y'。]
答案 0 :(得分:6)
如果您的列具有NULL值,则不能将其更改为“NON NULL”。首先将NULL值更改为其他值,然后尝试它。
答案 1 :(得分:6)
我刚遇到此错误,似乎解决方案是使用IGNORE
语句:
ALTER IGNORE TABLE `table` CHANGE COLUMN `col` `col` int(11) NOT NULL;
请注意,您可能仍会遇到数据截断问题,因此请确保这是所需的结果。使用IGNORE语句,它将抑制列中NULL值的数据截断错误(以及可能的其他错误!!!)
答案 2 :(得分: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';
答案 3 :(得分:0)
就我而言,我将列设置为 NOT NULL
ALTER TABLE `request_info`
CHANGE COLUMN `col_2` `col_2`
VARCHAR(2000)
NOT NULL -- here was setting it to NULL when the existing col allowed NULL
AFTER `col_1`
以前,我将该列设置为 DEFAULT NULL (即允许NULL值),因此,如果要允许NULL,则可以执行以下操作:
ALTER TABLE `request_info`
CHANGE COLUMN `col_2` `col_2`
VARCHAR(2000)
DEFAULT NULL -- changed from NOT --> DEFAULT
AFTER `col_1`