ITPub博客

首页 > 数据库 > > 11.7 数据类型默认值

11.7 数据类型默认值

作者:飘絮絮絮丶 时间:2020-05-12 10:35:05 0 删除 编辑

参考官方文档:


dev.mysql.com/doc/refma



数据类型定义中的DEFAULT值子句指示列的默认值。 有一个例外,默认值必须是常数; 它不能是一个函数或表达式。 这意味着,例如,您不能将日期列的默认值设置为NOW()或CURRENT_DATE等函数的值。 例外是您可以指定CURRENT_TIMESTAMP作为TIMESTAMP和DATETIME列的默认值。


BLOB,TEXT,GEOMETRY和JSON列不能被分配默认值。


如果列定义没有包含明确的DEFAULT值,那么MySQL按如下方式确定默认值:


如果列可以将NULL作为值,则使用明确的DEFAULT NULL子句定义该列。


如果列不能取NULL作为值,MySQL将定义没有显式DEFAULT子句的列。 例外:如果列被定义为PRIMARY KEY的一部分,但不是显式地作为NOT NULL,则MySQL将其创建为NOT NULL列(因为PRIMARY KEY列必须为NOT NULL)。 在MySQL 5.7.3之前,该列还被分配了一个使用隐式默认值的DEFAULT子句。 为了防止出现这种情况,请在任何PRIMARY KEY列的定义中包含显式的NOT NULL。


对于没有显式DEFAULT子句的NOT NULL列中的数据输入,如果INSERT或REPLACE语句不包含该列的值,或者UPDATE语句将该列设置为NULL,则MySQL根据当前有效的SQL模式处理该列:


  • 如果启用严格的SQL模式,则事务表发生错误,并且语句会回滚。 对于非事务性表,会发生错误,但如果这种情况发生在多行语句的第二行或后续行中,则前面的行将被插入
  • 如果严格模式未启用,则MySQL将列设置为列数据类型的隐式默认值。



假设表t定义如下:

CREATE TABLE t (i INT NOT NULL);


在这种情况下,我没有明确的默认值,所以在严格模式下,以下每个语句都会产生错误,并且不会插入行。 当不使用严格模式时,只有第三个语句会产生错误; 为前两个语句插入隐式默认值,但第三个语句失败,因为DEFAULT(i)无法生成值:


INSERT INTO t VALUES();

INSERT INTO t VALUES(DEFAULT);

INSERT INTO t VALUES(DEFAULT(i));



对于给定的表,可以使用SHOW CREATE TABLE语句来查看哪些列具有明确的DEFAULT子句。


隐式默认值定义如下:


  • 对于数字类型,默认值为0,不同之处在于对于使用AUTO_INCREMENT属性声明的整型或浮点型类型,缺省值是序列中的下一个值。
  • 对于TIMESTAMP以外的日期和时间类型,默认值为该类型的相应“零”值。 如果启用了explicit_defaults_for_timestamp系统变量(参见第5.1.5节“服务器系统变量”),那么TIMESTAMP也是如此。 否则,对于表中的第一个TIMESTAMP列,缺省值是当前日期和时间。
  • 对于ENUM以外的字符串类型,默认值是空字符串。 对于ENUM,默认值是第一个枚举值。


整数列的定义中的SERIAL DEFAULT VALUE是NOT NULL AUTO_INCREMENT UNIQUE的别名。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69946831/viewspace-3155936/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-09-09

  • 博文量
    2646
  • 访问量
    42249