首页 > 数据库 > > 11.7 数据类型默认值
参考官方文档:
https://dev.mysql.com/doc/refman/5.7/en/data-type-defaults.html
数据类型定义中的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模式处理该列:
假设表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子句。
隐式默认值定义如下:
整数列的定义中的SERIAL DEFAULT VALUE是NOT NULL AUTO_INCREMENT UNIQUE的别名。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69946831/viewspace-3155936/ ,如需转载,请注明出处,否则将追究法律责任。