在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
有同学说遇到了主从不一致的问题。 大概情况是,从库是用mysqldump导出导入数据的方式创建的。创建成功后,在用mysqldump验证主从的表结构是否一致的时候,发现有些表定义不一致: 从他的比较结果可以看到,在从库端,有三个列的定义中被加入了“default null”。 怀疑环境被人人为修改过,但是最终确认环境没有被动过。然后又做了一边测试,使用mysqldump导出数据,使用source将数据导入从库后,发现还是有这个现象,问是不是source命令有bug! 其实,这个跟MySQL内部如何处理隐式默认值有关。如果数据类型没有包含显式的default值,MySQL会按照如下的规则确定默认值: 对于将数据输入没有显式DEFAULT子句的NOT NULL列的情况,如果INSERT或REPLACE语句不包含该列的值,或者UPDATE语句将该列设置为NULL,届时则MySQL将根据有效的SQL Mode处理该列: 假设表t定义如下: mysql> create table t(i int not null); 这里,i没有显式的默认值。 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子句。对于隐式的默认值定义如下: 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 隐式默认值的资料请关注极客世界其它相关文章! |
请发表评论