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

大概情况是,从库是用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 intt默认值_MySQL如何处理隐式默认值相关推荐

  1. VTK:隐式布尔值demo用法实战

    VTK:隐式布尔值demo用法实战 程序输出 程序完整源代码 程序输出 程序完整源代码 #include <vtkActor.h> #include <vtkBox.h> #

  2. VTK:隐式布尔值用法实战

    VTK:隐式布尔值用法实战 程序输出 程序完整源代码 程序输出 程序完整源代码 #include <vtkActor.h> #include <vtkColor.h> #

  3. php mysql 字段自增_MySQL自增字段取值的详细介绍(附代码)

    本篇文章给大家带来的内容是关于MySQL自增字段取值的详细介绍(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 1 前言 本文来自回答思否网友的一个问题,这个网友新建了一张表 ...

  4. mysql自增默认值_mysql auto_increment自增初始值与步长

    MySQl自增列起始与步长 自增初始值 一.alter的使用 默认初始值为1 步长为1的情况 1.建表 2.插入数据 当插入数据可以看到步长为1,起始值为1 3.增加一列数据时 默认在加上步长 4.删 ...

  5. mysql 默认时间_mysql中如何设置默认时间为当前时间?

    展开全部 修改日期类型为timestamp 并允许空,如下: CREATE TABLE `test` (`aaaa` varchar(50) NOT NULL,`createday` timestam ...

  6. mysql设置id起点_mysql自增ID起始值修改方法

    在MysqL中很多朋友都认为字段为AUTO_INCREMENT类型自增ID值是无法修改,其实这样理解是错误的,下面介绍MysqL自增ID的起始值修改与设置方法. 通常的设置自增字段的方法:创建表格时添 ...

  7. sqlyog怎么设置默认值_mysql 中怎样设置默认值为系统日期

    -- 方法一: 由于MySQL目前字段的默认值不支持函数,所以以create_time datetime default now() 的形式设置默认值是不可能的.代替的方案是使用TIMESTAMP类型 ...

  8. mysql 插入指定值_mysql实现随机把字段值插入指定表

    今天在一个群里,一个小伙伴问了一个问题,mysql怎么随机把字母A或者B插入到表中的某个字段中去 案例如下: INSERT INTOt_rand(sex)VALUES(ELT(CEILING(rand ...

  9. 下列有关mysql数据库中的null值_MySQL数据库中与 NULL值有关的问题

    对于SQL的新手,NULL值的概念常常会造成混淆,他们常认为NULL是与空字符串"相同的事.情况并非如此.例如,下述语句是完全不同的: mysql> INSERT INTO my_ta ...

最新文章

  1. 数据科学的完整学习路径—Python版
  2. 项目中的一个JQuery ajax实现案例
  3. Apache2.4x版本的403问题
  4. Android之解决布局文件图片太大同步放缩后挤掉其它布局的问题
  5. python字符串startswith_Python 字符串 startswith() 使用方法及示例
  6. REVERSE-PRACTICE-BUUCTF-1
  7. hiveserver2启动不起来_汽车一键启动只能用来打火吗 车主必须知道的几个“隐藏”技巧!...
  8. JavaScript继承详解(三)
  9. poj 1422 Air Raid 最小二分匹配 基础
  10. IDEA快捷键+使用小技巧
  11. Python 可轻松获取天气数据、可视化分析
  12. 2013台式计算机,显卡天梯图 2013最新台式机显卡天梯图
  13. Android的gradle提示Could not resolve com.android.support:support-v4:26+.
  14. 工程矩阵理论 Hermite 矩阵
  15. oracle 查询表最大值,ORA-1653报错 调整oracle数据表的最大值
  16. 远程计算机仿真终端,仿真终端的使用返回主页关闭.doc
  17. RFID防盗安全门,自助借还书机,让图书馆发展进入新的里程碑
  18. 题目1026 c语言,1026 程序运行时间——C/C++实现
  19. Mybatis之Mapper代理开发方式
  20. ubuntu | 用crossover安装-微信和企业微信

热门文章

  1. 小新触控板不能用了_小新Pad Pro体验----高颜值新青年平板
  2. 京东物流:将连续第10年春节也送货 为坚守岗位一线员工补贴近4亿元
  3. 郭明錤:iPhone 13 Pro系列将有1TB储存空间
  4. 《你好李焕英》票房超《神奇女侠》,贾玲成全球票房最高女导演
  5. 苹果汽车自动驾驶又出新信号:正与多家激光雷达供应商谈判
  6. 1499元被标149元,苹果官网产品出现Bug价后续:白高兴了!
  7. 余承东:Mate40系列5000万像素远好于友商1亿像素
  8. 华为Mate40 Pro国行或定价6499元起 将会提供多个版本
  9. 小米10超大杯本月亮相稳了:无线快充纪录将再次刷新
  10. B站up主被曝靠卖惨吸粉月入十万,B站回应...