MySQL数据库中的隐式默认值是如何处理的

  

MySQL数据库中的隐式默认值是如何处理的?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

大概情况是,从库是用,mysqldump导出导入数据的方式创建的。创建成功后,在用,mysqldump验证主从的表结构是否一致的时候,发现有些表定义不一致:

 MySQL数据库中的隐式默认值是如何处理的

从他的比较结果可以看的到,在从库端,有三个列的定义中被加入了“默认空”。

怀疑环境被人人为修改过,但是最终确认环境没有被动过。然后又做了一边测试,使用,mysqldump导出数据,使用源将数据导入从库后,发现还是有这个现象,问是不是源命令有虫子!

其实,这个跟MySQL内部如何处理隐式默认值有关。

如果数据类型没有包含显式的默认值,MySQL会按照如下的规则确定默认值:
·如果该列可以采用null值作为值,该列在定义的时候会被加上一个显式的违约零子句
·如果该列不可以采用null值作为值,该列在定时候就不会加上一个显式的默认子句

对于将数据输入没有显式的默认子句的NOT null列的情况,如果插入或替换语句不包含该列的值,或者更新语句将该列设置为空,届时则MySQL将根据有效的SQL模式处理该列:
·如果启用了严格的SQL模式(严格的SQL模式),则事务表将发生错误,并且该语句将回滚。对于非事务表,会发生错误,但是如果此错误发生在多行语句的第二行或后续行中,则该错误之前的所有行均已插入。
·如果未启用严格模式,则MySQL将列设置为列数据类型的隐式默认值。

假设表t定义如下:

mysql>, create  table  t(小姐,int  not  null);

这里,我没有显式的默认值。
在严格的SQL模式下、下面的语句都会产生错误,插入失败。

mysql>, show  variables  like  & # 39; % sql_mode % & # 39;;   + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +   | |,Variable_name  Value ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, |   + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +   |,sql_mode ,,,,, |, ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER NO_ENGINE_SUBSTITUTION  |   + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +   1,row  set 拷贝;(0.01,sec)   ,   mysql>, INSERT  INTO  t 价值();   ERROR  1364, (HY000):, Field  & # 39;我# 39;,并# 39;t  have  a  default 价值   mysql>, INSERT  INTO  t 值(默认);   ERROR  1364, (HY000):, Field  & # 39;我# 39;,并# 39;t  have  a  default 价值   mysql>, INSERT  INTO  t 值(默认(i));   ERROR  1364, (HY000):, Field  & # 39;我# 39;,并# 39;t  have  a  default 价值   mysql>

在非严格的sql模式下:

mysql>, SET  @@sql_mode=& # 39; & # 39;;   Query 好吧,,0,rows 影响,,1,warning (0.00,秒)   ,   mysql>, show  variables  like  & # 39; % sql_mode % & # 39;;   +---------------+-------+   | |,Variable_name  Value  |   +---------------+-------+   |,sql_mode ,,,,, |,,,,,, |   +---------------+-------+   1,row  set 拷贝;(0.00,sec)   ,   mysql>, INSERT  INTO  t 价值();   Query 好吧,,1,row 影响,,1,warning (0.00,秒)   ,   mysql>, INSERT  INTO  t 值(默认);   Query 好吧,,1,row 影响,,1,warning (0.01,秒)   ,   mysql>, INSERT  INTO  t 值(默认(i));   ERROR  1364, (HY000):, Field  & # 39;我# 39;,并# 39;t  have  a  default 价值   mysql>, select  *,得到t;   +---+   |,小姐:|   +---+   |,0 |   |,0 |   +---+   2,rows  set 拷贝;(0.01,sec)   ,   mysql>

MySQL数据库中的隐式默认值是如何处理的