返回顶部
首页 > 资讯 > 数据库 >MySQL 如何处理隐式默认值
  • 782
分享到

MySQL 如何处理隐式默认值

MySQL处理默认值MySQL处理隐式默认值 2022-05-31 09:05:44 782人浏览 安东尼
摘要

有同学说遇到了主从不一致的问题。 大概情况是,从库是用Mysqldump导出导入数据的方式创建的。创建成功后,在用mysqldump验证主从的表结构是否一致的时候,发现有些表定义不一致: 从他的比较结果可以看到,在

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

大概情况是,从库是用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 隐式默认值的资料请关注自学编程网其它相关文章!

您可能感兴趣的文档:

--结束END--

本文标题: MySQL 如何处理隐式默认值

本文链接: https://lsjlt.com/news/10042.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • MySQL 如何处理隐式默认值
    有同学说遇到了主从不一致的问题。 大概情况是,从库是用mysqldump导出导入数据的方式创建的。创建成功后,在用mysqldump验证主从的表结构是否一致的时候,发现有些表定义不一致: 从他的比较结果可以看到,在...
    99+
    2022-05-31
    MySQL 处理默认值 MySQL 处理隐式默认值
  • 如何分析Freemarker空值处理及默认值
    这篇文章将为大家详细讲解有关如何分析Freemarker空值处理及默认值,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。FreeMarker中输出null值会报错,如果希望对象为null时,什...
    99+
    2023-06-26
  • mysql如何设置字段默认值
    在MySQL中,可以使用DEFAULT关键字来设置字段的默认值。在创建表时,可以通过DEFAULT关键字为字段指定默认值,例如: C...
    99+
    2024-04-09
    mysql
  • MySQL 字段默认值该如何设置
    前言:  在 MySQL 中,我们可以为表字段设置默认值,在表中插入一条新记录时,如果没有为某个字段赋值,系统就会自动为这个字段插入默认值。关于默认值,有些知识还是需要了解的,本篇文章我们一起来学习下字段默...
    99+
    2022-05-17
    MySQL 字段 MySQL 字段默认值 MySQL 字段默认值设置
  • 如何设置MySQL的字段默认值
    本篇文章给大家分享的是有关如何设置MySQL的字段默认值,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。 1.默认值相关操作我们可以用 DEFAULT 关键字来定义默认...
    99+
    2023-06-06
  • mysql如何给字段设置默认值
    在创建表时,可以在字段定义中使用DEFAULT关键字来设置默认值。例如: CREATE TABLE table_name ( ...
    99+
    2024-04-09
    mysql
  • mysql数据库默认值如何设置
    在MySQL数据库中,可以使用DEFAULT关键字来设置默认值。 可以在创建表时,使用DEFAULT关键字来为列设置默认值,如下所示...
    99+
    2024-04-09
    mysql
  • MySQL如何修改字段的默认值和空值
    目录mysql修改字段的默认值和空值修改字段默认值修改字段值是否为空MySQL默认值NULL、空值、Empty String的区别如何选择?先说结论区别MySQL修改字段的默认值和空值 修改字段默认值 修改: ALTER...
    99+
    2024-04-02
  • MySQL中如何为字段设置默认值?
    在MySQL中,我们可以为表的字段设置默认值,以确保在插入新记录时,如果没有为该字段指定值,将使用默认值。这在许多情况下都非常有用,特别是当我们希望在插入数据时自动填充某些字段,或者当我们想要为字段提...
    99+
    2023-10-23
    mysql 数据库
  • 如何处理MySQL多个timestamp字段自动添加默认值的问题
    这篇文章主要介绍如何处理MySQL多个timestamp字段自动添加默认值的问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! MySQL版本5.6.14...
    99+
    2024-04-02
  • 如何在 MySQL INSERT 语句中指定默认值?
    在创建表时,如果任何列定义了默认值,那么通过在 INSERT 语句中使用关键字“DEFAULT”,我们可以为该列获取默认值。例如,我们创建了一个表“employee”,其默认值为“DOJ”列,如下所示 -mysql> Create t...
    99+
    2023-10-22
  • mysql字段默认值如何设置比较好
    设置MySQL字段的默认值要根据具体的业务需求和数据类型来决定。以下是设置MySQL字段默认值的几个常见做法: 对于数值型字段,...
    99+
    2023-10-23
    mysql
  • mysql如何设置默认值为当前日期
    在MySQL中,可以使用DEFAULT关键字来设置默认值为当前日期。具体步骤如下: 创建表时,在定义日期类型的字段时使用DEFAU...
    99+
    2024-04-09
    mysql
  • 如何解决mysql timestamp无法插入带默认值
    下面一起来了解下如何解决mysql timestamp无法插入带默认值,相信大家看完肯定会受益匪浅,文字在精不在多,希望如何解决mysql timestamp无法插入带默认值这篇短内容是你想要的。创建表的时...
    99+
    2024-04-02
  • 如何解决MySQL报错:字段没有默认值
    当MySQL报错提示字段没有默认值时,意味着您正在尝试插入一条数据时,其中某些字段没有被赋予初值。解决这个问题的方法有以下几种:1....
    99+
    2023-10-12
    MySQL
  • html如何设置input的默认值
    本篇内容主要讲解“html如何设置input的默认值”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“html如何设置input的默认值”吧! ...
    99+
    2024-04-02
  • python函数如何设置默认值
    在python中使用def关键词给函数设置默认值,具体方法如下:def关键词语法:def 函数名(...,形参名,形参名=默认值):代码块使用方法:def dis_str(str1,str2 = "h...
    99+
    2024-04-02
  • JavaScript默认参数值如何简写
    这篇文章主要介绍了JavaScript默认参数值如何简写,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。默认参数值为了给函数中参数传递默认值,通常使用if语句来编写,但是使用E...
    99+
    2023-06-27
  • python如何设置字典默认值
    这篇文章主要介绍python如何设置字典默认值,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!字典默认值通过 Key 取对应的 Value 值,可以通过以下方式设置默认值。如果 get() 方法没有设置默认值,那么如果...
    99+
    2023-06-27
  • JavaScript如何判空并赋默认值
    小编给大家分享一下JavaScript如何判空并赋默认值,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!判空并赋默认值Code Review 的时候我经常看到这样的...
    99+
    2023-06-27
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作