mysql给字段加默认值(MySQL 如何处理隐式默认值)
mysql给字段加默认值
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_liISION_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 隐式默认值的资料请关注开心学习网其它相关文章!
原文链接:https://www.cnblogs.com/abclife/p/13993944.html
- 如何看idea连接mysql数据库(IDEA 链接Mysql数据库并执行查询操作的完整代码)
- mysql建表时指定聚簇索引(一看就懂的MySQL的聚簇索引及聚簇索引是如何长高的)
- mysqlset用法(mysql descDESCRIBE命令实例讲解)
- 如何安装phpmysql环境(phpnow重新安装mysql数据库的方法)
- mysql安装详解(MySQL Router的安装部署)
- mysql怎么看脱机数据(MYSQL电话号码,身份证数据脱敏的实现)
- docker搭建mysql服务(Docker部署Mysql集群的实现)
- mysql基本查询方法(MySQL 重写查询语句的三种策略)
- mysql5.7.24rpm安装(MySQL系列-YUM及RPM包安装v5.7.34)
- mysql8.0.18.0安装详细教程(mysql 8.0.22 下载安装配置方法图文教程)
- mysql触发器如何创建(MySQL 触发器的使用和理解)
- mysql时间戳和datetime对比(mysql中 datatime与timestamp的区别说明)
- centos7可以装mysql吗(详解腾讯云CentOS7.0使用yum安装mysql及使用遇到的问题)
- mysql怎么解决幻读问题(详解MySQL幻读及如何消除)
- docker查找redis配置文件(解决docker重启redis,mysql数据丢失的问题)
- 阿里云ecs服务器数据在哪儿(阿里云ECS云服务器linux系统安装mysql后远程连接不了踩坑)
- 魅族智能手表充电座曝光 Type-C 接口,线座分离设计(魅族智能手表充电座曝光)
- 华为 Watch GT2 Pro 智能手表曝光,新增支持无线充电(华为WatchGT2)
- vivo首款智能手表来了 也有血氧饱和度监测,一次充电18天续航(vivo首款智能手表来了)
- 你知道 七夕 的真正含义吗(你知道七夕的真正含义吗)
- 七夕的寓意(七夕的寓意)
- 苏志燮赵恩静结婚,韩国四大公共财产变三人,这么快就有替补了(苏志燮赵恩静结婚)
热门推荐
- 云服务器备案吗(免备案云服务器与国内云服务器有什么不同?)
- python炫酷烟花源代码(python实现浪漫的烟花秀)
- thinkphp使用说明(thinkphp框架使用JWTtoken的方法详解)
- JQuery中serialize与serializeArray
- dedecms导入doc插件(DEDECMS教程之静态模板类类文件)
- linux下如何启动phpstudy面板(详解phpstudy linux web面板小皮面板V0.2版本正式发布)
- python基础教学之125 装饰器简介(python3 property装饰器实现原理与用法示例)
- mysql数据库基础练习(最全50个Mysql数据库查询练习题)
- sqlserver 查询数据库增长设置(SQL设置SQL Server最大连接数及查询语句)
- js使用canvas(JavaScript canvas实现七彩时钟效果)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9