这是我的数据库,在建表的时候没有设置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"