mysql数据类型默认值_MySQL数据类型 - 数据类型默认值

数据类型默认值html

数据类型规范能够有显式或隐式的默认值。mysql

数据类型规范中的DEFAULT值子句显式指示列的默认值。示例:sql

f8d2e50e7d8100065105722c211a5de8.png

SERIAL DEFAULT VALUE是一种特殊状况。在整数列的定义中,它是NOT NULL AUTO_INCREMENT UNIQUE的别名。安全

处理显式DEFAULT子句,某些方面依赖于特定版本,以下所述。服务器

●MySQL 8.0.13处理显式默认值ide

●MySQL8.0.13以前处理显式默认值函数

●处理隐式默认值日志

MySQL 8.0.13处理显式默认值orm

DEFAULT子句中指定的默认值能够是字面常量或表达式。有一个例外,将表达式默认值括在括号内,以区别于字面常量默认值。示例:htm

例外状况是,对于TIMESTAMP和DATETIME列,能够指定CURRENT_TIMESTAMP函数做为默认值,而不须要用括号括起来。

只有用表达式才能给BLOB、TEXT、GEOMETRY和JSON数据类型分配默认值,即便表达式值是字面量:

●这种方式可行(字面量默认值指定为表达式):

0d773c61a95d429eeb5911216700f440.png

●这种方式将产生错误(字面量默认值未指定为表达式):

546b7bfc09151d73274abf07c4be1a6a.png

表达式默认值必须符合如下规则。若是表达式包含不容许的结构,则会发生错误。

●容许使用字面量、内置函数(肯定性函数和非肯定性函数)以及运算符。

●不容许使用子查询、参数、变量、存储过程和用户定义函数。

●表达式默认值不能依赖于具备AUTO_INCREMENT属性的列。

●列的表达式默认值能够引用其余列,可是表达式默认值引用的生成列或具备表达式默认值的列必须是前向引用。

这个顺序约束也适用于使用ALTER TABLE语句从新排序表的列。若是结果表的表达式默认值包含对生成的列或具备表达式默认值的列的后向引用,则该语句将失败。

对于CREATE TABLE ... LIKE 和 CREATE TABLE ... SELECT语句,则目标表将保留原始表中的表达式默认值。

若是表达式默认值引用不肯定函数,则致使表达式计算的任何语句对于基于语句的复制来讲都是不安全的。这包括INSERT和UPDATE等语句。在这种状况下,若是禁用了二进制日志记录,则该语句将正常执行。若是启用了二进制日志记录,而且binlog_format设置为STATEMENT,则会记录并执行该语句,但会在错误日志中写入一条警告消息,由于复制从属服务器可能会发生分歧。当binlog_format设置为MIXED或ROW时,语句将正常执行。

插入新行时,能够经过省略列名或将列指定为DEFAULT(就像对于具备字面量默认值的列同样)来插入具备表达式默认值的列:

227d81a8c223a119ffd70c48f2e9b9b3.png

可是,仅容许对具备字面量默认值的列使用DEFAULT(col_name)指定列为默认值,而不容许对具备表达式默认值的列使用。

并不是全部存储引擎都容许表达式默认值。对于不支持的存储引擎,会引起 ER_UNSUPPORTED_ACTION_ON_DEFAULT_VAL_GENERATED 错误。

若是默认值的计算结果与声明的列类型不一样,则会根据一般的MySQL类型转换规则隐式转换为声明的类型。

MySQL8.0.13以前处理显式默认值

有一个不一样状况,DEFAULT子句中指定的默认值必须是字面常量;它不能是函数或表达式。这意味着,不能将日期列的默认值设置为函数的值,例如NOW()或CURRENT_DATE。例外状况是,对于TIMESTAMP和DATETIME列,能够将CURRENT_TIMESTAMP指定为默认值。

没法为BLOB、TEXT、GEOMETRY和JSON数据类型分配默认值。

若是默认值的计算结果与声明的列类型不一样,则会根据常规的MySQL类型转换规则隐式转换为声明的类型。

处理隐式默认值

若是一个数据类型规范中没有显式的默认值,那么MySQL会按以下方式肯定默认值:

若是列能够接受NULL值,则使用显式的DEFAULT NULL子句定义该列。

若是列不能接受NULL值,MySQL将不使用显式DEFAULT子句定义该列。

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

●若是启用了严格SQL模式,事务表将出错,语句将回滚。对于非事务表,会引起错误,但若是多行语句的第二行或后续行发生这种状况,则前面的行将被插入。

●若是未启用严格模式,MySQL会将列设置为列数据类型的隐式默认值。

假设表t的定义以下:

93457691449f588d4f3d21eb7e0552be.png

在本例中,i没有显式默认值,所以在严格模式下,下面的每一个语句都会产生一个错误,而且不会插入任何行。不使用严格模式时,只有第三条语句产生错误;前两条语句插入隐式默认值,但第三条语句失败,由于DEFAULT(i)没法生成值:

2f79e23fc4be2c91619f79786d5d4f38.png

对于给定的表,SHOW CREATE TABLE语句显示哪些列具备显式DEFAULT子句。

隐式默认值定义以下:

●对于数值类型,默认值为0,可是有个例外,对于使用AUTO_INCREMENT属性声明的整数或浮点类型,默认值是序列中的下一个值。

●对于TIMESTAMP之外的日期和时间类型,默认值是该类型的适当的"零"值。若是启用了explicit_defaults_for_timestamp系统变量,则TIMESTAMP类型也是如此。不然,对于表中的第一个TIMESTAMP列,默认值为当前日期和时间。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值