• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    MySQL 如何处理隐式默认值

    有同学说遇到了主从不一致的问题。

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

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

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

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

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

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

    假设表t定义如下:

    mysql> create table t(i int not null);

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

    mysql> show variables like '%sql_mode%';
    +---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
    | 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 in set (0.01 sec)
     
    mysql> INSERT INTO t VALUES();
    ERROR 1364 (HY000): Field 'i' doesn't have a default value
    mysql> INSERT INTO t VALUES(DEFAULT);
    ERROR 1364 (HY000): Field 'i' doesn't have a default value
    mysql> INSERT INTO t VALUES(DEFAULT(i));
    ERROR 1364 (HY000): Field 'i' doesn't have a default value
    mysql>

    在非严格的sql mode下:

    mysql> SET @@sql_mode='';
    Query OK, 0 rows affected, 1 warning (0.00 sec)
     
    mysql> show variables like '%sql_mode%';
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | sql_mode      |       |
    +---------------+-------+
    1 row in set (0.00 sec)
     
    mysql> INSERT INTO t VALUES();
    Query OK, 1 row affected, 1 warning (0.00 sec)
     
    mysql> INSERT INTO t VALUES(DEFAULT);
    Query OK, 1 row affected, 1 warning (0.01 sec)
     
    mysql> INSERT INTO t VALUES(DEFAULT(i));
    ERROR 1364 (HY000): Field 'i' doesn't have a default value
    mysql> select * from t;
    +---+
    | i |
    +---+
    | 0 |
    | 0 |
    +---+
    2 rows in set (0.01 sec)
     
    mysql>

    对于给定的表,SHOW CREATE TABLE语句显示哪些列具有显式的DEFAULT子句。对于隐式的默认值定义如下:
    ·对于numeric类型,默认值为0,但对于用AUTO_INCREMENT属性声明的整数或浮点类型,默认值为序列中的下一个值。
    ·对于除TIMESTAMP以外的date和time类型,默认值为该类型的"零"值。如果启用了explicit_defaults_for_timestamp系统变量,对于TIMESTAMP也是如此。否则,对于表中的第一个TIMESTAMP列,默认值为当前日期和时间。
    ·对于ENUM以外的其他字符串类型,默认值为空字符串。对于ENUM,默认值为第一个枚举值。

    mysql> create table t1(id int,name varchar(20));
    Query OK, 0 rows affected (0.04 sec)
     
    mysql> show create table t1\G
    *************************** 1. row ***************************
           Table: t1
    Create Table: CREATE TABLE `t1` (
      `id` int(11) DEFAULT NULL,
      `name` varchar(20) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
    1 row in set (0.00 sec)
     
    mysql>

    以上就是MySQL 如何处理隐式默认值的详细内容,更多关于MySQL 隐式默认值的资料请关注脚本之家其它相关文章!

    您可能感兴趣的文章:
    • mysql查询的时候给字段赋默认值操作
    • 详解Mysql数据库date, datetime类型设置0000-00-00默认值(default)报错问题
    • MySQL5.7中的sql_mode默认值带来的坑及解决方法
    • mysql中datetime类型设置默认值方法
    • MySQL命令行中给表添加一个字段(字段名、是否为空、默认值)
    • Mysql select语句设置默认值的方法
    • 解析MySQL设置当前时间为默认值的方法
    • MySQL表字段设置默认值(图文教程及注意细节)
    • Mysql 5.6 "隐式转换"导致的索引失效和数据不准确的问题
    • 解析MySQL隐式转换问题
    • MySQL的隐式类型转换整理总结
    上一篇:explain命令为什么可能会修改MySQL数据
    下一篇:详解MySQL拼接函数CONCAT的使用心得
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    MySQL 如何处理隐式默认值 MySQL,如何,处理,隐式,默认值,