MySQL 数据类型:数据类型默认值

来自Wikioe
跳到导航 跳到搜索


显式默认值

数据类型规范中的“DEFAULT value”子句明确指示列的默认值。如:

CREATE TABLE t1 (
  i     INT DEFAULT -1,
  c     VARCHAR(10) DEFAULT '',
  price DOUBLE(16,2) DEFAULT '0.00'
);
  • SERIAL DEFAULT VALUE”是一种特殊情况。在整数列的定义中,它是“NOT NULL AUTO_INCREMENT UNIQUE”的别名。
  • “DEFAULT”子句中指定的默认值必须为字面量常量;它不能是函数或表达式。例如,这意味着您不能将日期列的默认值设置为“NOW()”或“CURRENT_DATE”之类的函数的值。
    • 唯一的例外是,对于“TIMESTAMP”和“DATETIME”列,您可以将“CURRENT_TIMESTAMP”指定为默认值。
  • 不能为 BLOB,TEXT,GEOMETRY 和 JSON 数据类型分配默认值。

隐式默认值

如果数据类型规范不包含显式的“DEFAULT”值,则 MySQL 按照以下方式确定默认值:

  1. 如果该列可以使用 NULL 作为值,则使用显式“DEFAULT NULL”子句定义该列。
  2. 如果该列不能使用 NULL 作为值,则 MySQL 定义该列时不带显式“DEFAULT”子句。


为了将数据输入到没有显式“DEFAULT”句的“NOT NULL”列中,如果“INSERT”或“REPLACE”语句不包含该列的值,或者“UPDATE”语句将列设置为“NULL”,则 MySQL 将根据有效的 SQL 模式处理该列。时间:

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


示例,假设表 t 定义如下:

CREATE TABLE t (i INT NOT NULL);

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

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


  • 对于给定的表,“SHOW CREATE TABLE tbl_name”语句显示哪些列具有显式的“DEFAULT”子句。


隐式默认值定义如下:

  1. 对于数字类型,默认值为0,但对于使用“AUTO_INCREMENT”属性声明的整数或浮点类型,默认值为序列中的下一个值。
  2. 对于 TIMESTAMP 以外的日期和时间类型,默认值为该类型的适当“零”值。【如果启用了“explicit_defaults_for_timestamp”系统变量,则对于TIMESTAMP也是如此】否则,对于表中的第一个 TIMESTAMP 列,默认值为当前日期和时间。
  3. 对于 ENUM 以外的其他字符串类型,默认值为空字符串。对于 ENUM,默认值为第一个枚举值。