MySQL已有column值为NULL,修改列属性为NOT NULL报1138错误

MySQL已有column值为NULL,修改列属性为NOT NULL报1138错误_第1张图片

这是我的数据库,在建表的时候没有设置email、comment列为非空,其默认值便为NULL,现在我想把列属性改为NOT NULL DEFAULT ''。你可以看到我的email字段成功了,但并没有设置NOT NULL,只是设置了DEFAULT为空字符串。

-> ALTER TABLE tb_name MODIFY email VARCHAR(100) DEFAULT '';
Query OK, 0 rows affected (0.01 sec)

这时已经执行成功了,但加上NOT NULL就报错:
ERROR 1138 (22004): Invalid use of NULL value

原因是有一些列的默认值已经为NULL,此时设置NOT NULL在语意上造成了冲突,故得先把NULL改掉。

-> UPDATE tb_name SET comment = '' WHERE comment IS NULL;
-> ALTER TABLE tb_name MODIFY comment VARCHAR(255) NOT NULL DEFAULT '';

另外,最好将列设置为NOT NULL,数字默认值设为0,字符串设为空字符串''
如果没有开启严格模式(strict mode),对于超出范围的字符串,MySQL会采取截断超出部分的方法;设置了NOT NULL,没有设置DEFAULT的列,当不插入数据时也不会报错,而是对于数字默认写入0,对于字符串默认写入''等等。因此,无论开发阶段还是上线,都需要检查是否开启了严格模式,这会避免很多错误。

查看严格模式是否开启:
-> SHOW VARIABLES LIKE "%str%";

-> select @@sql_mode;

临时设置,重启失效:
-> SET GLOBAL sql_mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

永久设置需修改配置文件my.conf
sql_mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

你可能感兴趣的:(mysql,数据库,MySQL)