事情的起因
- 有一张简单的表结构如下:
create table test
(
id VARCHAR(64) null,
name VARCHAR(64) default "张三" null
);
- 有一天,业务不需要新建的数据都叫张三了.希望都为空.
于是我执行了,
alter table test alter column name drop default;
- 然后兴致勃勃的去测试.
INSERT INTO test (id) VALUE (1)
- 然后数据库不高兴了.
[2021-04-30 09:21:32] [HY000][1364] Field 'name' doesn't have a default value
- 提示我name没有默认值.
解决方案
我找到了一个解决方案.
第2步改为了.
alter table test alter column name set default NULL;
然后重新执行
INSERT INTO test (id) VALUE (1)
这次没有报错.
原因
两种语句其实都是想去掉"张三"这个默认的配置.
但区别在于.第一种,是drop掉默认值,却没告诉数据库,新的默认值是什么.
而第二种,是明确告知数据库,默认值是null.
如果你不显示的drop掉default.那么default是有默认值的,就是null(null也是一种特殊值).
插入的时候,也会帮你把你没说的字段,都默认为null.
但如果你显示的声明要drop掉default.那么你插入的时候,要么把这个字段加上值,要么给人家一个默认值.
否则数据库就会报错.因为数据库最终插入后,要保证每个字段都有值.哪怕是null这种"特殊值",但总归要有值.
当然,这可能是源于:sql_mode:数据校验
当我们的sql_mode配置中声明开启严格模式的时候.
你的插入语句就会严格执行.
具体没有看,所以不确定里面的原理.暂时记录到这.