[译] MySQL 数据类型的默认值

原文地址:https://dev.mysql.com/doc/refman/5.7/en/data-type-defaults.html

在数据类型规范中 DEFAULT value 表示该列的默认值。默认值必须是常数,不能是一个函数或表达式。 例如,不能将 date 列的默认值设置为函数的值,如 NOW()CURRENT_DATE唯一例外的是,可以将 CURRENT_TIMESTAMP 指定为 TIMESTAMPDATETIME 类型的默认值。 参考 第 12.3.5 节 “Automatic Initialization and Updating for TIMESTAMP and DATETIME”

BLOBTEXT,GEOMETRY 和 JSON 列不能设置默认值。

如果在定义列时没有显式指定默认值(DEFAULT value),MySQL 将按以下方式设置默认值:

  • 如果一个列可以将 NULL 作为一个值,该列就显式定义为: DEFAULT NULL
  • 如果一个列不能将 NULL 作为一个值,MySQL 将不对该列显式定义 DEFAULT 属性。
    主键列属于特殊情况:如果某一主键列没有显式定义 NOT NULL,MySQL 将为它设置 NOT NULL(因为主键列必须是 NOT NULL) 。在 MySQL 5.7.3 之前,主键列会隐式的加入一个默认值定义,为了避免这种情况,应该在任何主键列的定义中包含一个显式 NOT NULL 。

当没有显示指定默认值的列有数据插入或变更时,如果 INSERTREPLACE 语句不包含该列的值,或者 UPDATE 语句将该列设置为 NULL,则 MySQL 将根据当时的 SQL 模式做处理:

  • 如果启用 strict 模式,若是事务表,则会发生错误并回滚SQL语句。若是非事务表,则会发生错误,但多行语句执行时,错误行之前的SQL语句会生效。

  • 如果未启用 strict 模式,则 MySQL 将列设置为列数据类型的隐式默认值。

假设一个表 t 的定义如下:

CREATE TABLE t (i INT NOT NULL);

上述定义中,i 列没有显式的指定默认值,因此在 strict 模式下,下面三句SQL都会报错,不会插入数据。在非 strict 模式时,只有第三句报错,前两句会插入隐式默认值(因为 DEFAULT(i) 会报错,不会返回默认值):

INSERT INTO t VALUES();
INSERT INTO t VALUES(DEFAULT);
INSERT INTO t VALUES(DEFAULT(i));

参考 Section 6.1.8, “Server SQL Modes”.

可以使用 SHOW CREATE TABLE tablename 语句查看哪些列有 DEFAULT 语句。

隐式默认值定义如下:

  • 数字类型的默认值为 0,声明了 AUTO_INCREMENT 的 integer 和 浮点型字段的默认值为下一个序列值;

  • TIMESTAMP 之外的日期和时间类型,默认值为适当“零”值。如果启用了explicit_defaults_for_timestamp 系统变量,则 TIMESTAMP ,则默认值为适当的“零”值(请参见 第 6.1.5 节 “Server System Variables”)。否则,对于表中的第一个 TIMESTAMP 列,默认值为当前日期和时间。请参见 第 12.3 节“Date and Time Types”

  • ENUM 之外的字符串类型,默认值为空字符串。对于ENUM,默认值是第一个枚举值。

在 integer 列加 SERIAL DEFAULT VALUE 定义,等价于 NOT NULL AUTO_INCREMENT UNIQUE 。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,981评论 19 139
  • 什么是数据库? 数据库是存储数据的集合的单独的应用程序。每个数据库具有一个或多个不同的API,用于创建,访问,管理...
    chen_000阅读 4,057评论 0 19
  • 任务需求:定时执行的任务,调用存储过程,进行数据迁移。 存储过程相关总结:(存储过程的创建 不能伴随有if exi...
    时待吾阅读 3,129评论 0 4
  • MySQL技术内幕:SQL编程 姜承尧 第1章 SQL编程 >> B是由MySQL创始人之一Monty分支的一个版...
    沉默剑士阅读 2,475评论 0 3
  • 蓝椅撅着弯弯的腰 阳光温柔地照耀 承载平凡 亮了蓝椅的侧脸 仙女捧着遥控器 遮住嘴巴 是不想说话 还是害羞
    TJYzzd阅读 84评论 0 0