InnoDB参数之explicit_defaults_for_timestamp

本文详细解析了MySQL中timestamp列的默认值行为,特别是在explicit_defaults_for_timestamp变量为ON和OFF时的不同表现。当该变量为OFF时,首个未指定属性的timestamp列将默认设置为CURRENT_TIMESTAMP,而非首个timestamp列则可能因sql_mode设置而报错或赋值'0000-00-00 00:00:00'。当变量为ON时,timestamp列默认为NULL,且在没有指定default value和not null的情况下,插入行为受sql_mode影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

explicit_defaults_for_timestamp

    1)全局\会话级、动态变量,默认值 OFF,取值范围:OFF/ON
    2)当explicit_defaults_for_timestamp为OFF时:
        1)表里的第一个timestamp列,如果没有明确指定null、DEFAULT 、ON UPDATE属性的话,Mysql默认会赋予该列DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP属性
        2)不是表里的第一个timestamp列,如果没有明确指定null、DEFAULT 属性的话,Mysql默认会赋予该列 DEFAULT '0000-00-00 00:00:00'(如果sql_mode里有STRICT_ALL_TABLES或者STRICT_TRANS_TABLES或者NO_ZERO_DATE的话,该列在创建时会报错)
        3)The nonstandard behaviors just described are deprecated and will be removed in a future MySQL release.

mysql> show variables like '%explicit%';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| explicit_defaults_for_timestamp | OFF   |
+---------------------------------+-------+
1 row in set (0.01 sec)

mysql> show variables like '%sql_mode%';
+---------------+------------------------------------------------------------------------------------------------------------------------+
| Variable_name | Value                                                                                                                  |
+---------------+------------------------------------------------------------------------------------------------------------------------+
| sql_mode      | STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+---------------+------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> create table test0705(a timestamp);
Query OK, 0 rows affected (0.01 sec)

mysql> show create table test0705\G
*************************** 1. row ***************************
       Table: test0705
Create Table: CREATE TABLE `test0705` (
  `a` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

mysql> alter table test0705 add b timestamp;
ERROR 1067 (42000): Invalid default value for 'b'
mysql> alter table test0705 add b timestamp null;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

     3)当explicit_defaults_for_timestamp为ON时:
        1)timestamp列,如果不明确指定not null的话,默认是null,也允许null,不会有null转换成CURRENT_TIMESTAMP的情况
        2)timestamp列指定为not null但是没有指定default value的话,
如果sql_mode里有STRICT_ALL_TABLES或者STRICT_TRANS_TABLES或者NO_ZERO_DATE的话,插入和更新会报错,
如果sql_mode里没有STRICT_ALL_TABLES或者STRICT_TRANS_TABLES或者NO_ZERO_DATE的话,not null但是没有指定default value的列会插入'0000-00-00 00:00:00'

mysql> set session explicit_defaults_for_timestamp=ON;
Query OK, 0 rows affected (0.00 sec)

mysql> create table test0706(a timestamp,b timestamp);
Query OK, 0 rows affected (0.02 sec)

mysql> show create table test0706\G
*************************** 1. row ***************************
       Table: test0706
Create Table: CREATE TABLE `test0706` (
  `a` timestamp NULL DEFAULT NULL,
  `b` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

mysql> alter table test0706 add c timestamp not null;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show create table test0706\G
*************************** 1. row ***************************
       Table: test0706
Create Table: CREATE TABLE `test0706` (
  `a` timestamp NULL DEFAULT NULL,
  `b` timestamp NULL DEFAULT NULL,
  `c` timestamp NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

mysql> insert into test0706(a,b) values (null,null);
ERROR 1364 (HY000): Field 'c' doesn't have a default value

mysql> set session sql_mode='';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> insert into test0706(a,b) values (null,null);
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> select * from test0706;
+------+------+---------------------+
| a    | b    | c                   |
+------+------+---------------------+
| NULL | NULL | 0000-00-00 00:00:00 |
+------+------+---------------------+

 

db-server1 | 2025-03-20T14:09:00.076655Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details). db-server1 | 2025-03-20T14:09:00.079406Z 0 [Note] mysqld (mysqld 5.7.44) starting as process 1 ... db-server1 | 2025-03-20T14:09:00.087059Z 0 [Note] InnoDB: PUNCH HOLE support available db-server1 | 2025-03-20T14:09:00.087120Z 0 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins db-server1 | 2025-03-20T14:09:00.087130Z 0 [Note] InnoDB: Uses event mutexes db-server1 | 2025-03-20T14:09:00.087136Z 0 [Note] InnoDB: GCC builtin __atomic_thread_fence() is used for memory barrier db-server1 | 2025-03-20T14:09:00.087142Z 0 [Note] InnoDB: Compressed tables use zlib 1.2.13 db-server1 | 2025-03-20T14:09:00.087151Z 0 [Note] InnoDB: Using Linux native AIO db-server1 | 2025-03-20T14:09:00.087732Z 0 [Note] InnoDB: Number of pools: 1 db-server1 | 2025-03-20T14:09:00.087923Z 0 [Note] InnoDB: Using CPU crc32 instructions db-server1 | 2025-03-20T14:09:00.090339Z 0 [Note] InnoDB: Initializing buffer pool, total size = 128M, instances = 1, chunk size = 128M db-server1 | 2025-03-20T14:09:00.104268Z 0 [Note] InnoDB: Completed initialization of buffer pool db-server1 | 2025-03-20T14:09:00.107111Z 0 [Note] InnoDB: If the mysqld execution user is authorized, page cleaner thread priority can be changed. See the man page of setpriority(). db-server1 | 2025-03-20T14:09:00.123210Z 0 [Note] InnoDB: Highest supported file format is Barracuda. db-server1 | 2025-03-20T14:09:00.158427Z 0 [Note] InnoDB: Creating shared tablespace for temporary tables db-server1 | 2025-03-20T14:09:00.158582Z 0 [Note] InnoDB: Setting file './ibtmp1' size to 12 MB. Physically writing the file full; Please wait ... db-server1 | 2025-03-20T14:09:00.196700Z 0 [Note] InnoDB: File './ibtmp1' size is now 12 MB. db-server1 | 2025-03-20T14:09:00.1982
最新发布
03-21
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值