本文由大模型生成。
explicit_defaults_for_timestamp
是 MySQL 中的一个系统变量,它控制着 TIMESTAMP
列的默认行为和属性。该参数可以在 MySQL 配置文件(如 my.cnf
或 my.ini
)中设置,也可以在服务器启动时通过命令行参数设置,还可以在运行时通过 SQL 语句动态修改。
作用
默认行为:
explicit_defaults_for_timestamp = OFF
(MySQL 5.6.6 之前的默认行为):- 第一个
TIMESTAMP
列在没有显式指定NOT NULL
时,默认会被设置为NOT NULL
并且具有DEFAULT CURRENT_TIMESTAMP
和ON UPDATE CURRENT_TIMESTAMP
属性。 - 后续的
TIMESTAMP
列则默认允许NULL
。
- 第一个
explicit_defaults_for_timestamp = ON
(MySQL 5.6.6 及之后的默认行为):- 所有
TIMESTAMP
列在没有显式指定DEFAULT
或ON UPDATE
时,都不会有默认的时间戳行为。它们将表现得像其他类型的列一样,除非明确指定了DEFAULT
或ON UPDATE
子句。
- 所有
时间戳属性:
- 当
explicit_defaults_for_timestamp = ON
时,如果你希望TIMESTAMP
列具有自动更新或默认时间戳的功能,必须显式地指定DEFAULT CURRENT_TIMESTAMP
和/或ON UPDATE CURRENT_TIMESTAMP
。 - 当
explicit_defaults_for_timestamp = OFF
时,即使不显式指定,第一个TIMESTAMP
列也会自动具有这些属性。
- 当
示例
假设我们有一个表 example_table
,定义如下:
CREATE TABLE example_table (
id INT AUTO_INCREMENT PRIMARY KEY,
created_at TIMESTAMP,
updated_at TIMESTAMP
);
explicit_defaults_for_timestamp = OFF
:created_at
列将默认具有DEFAULT CURRENT_TIMESTAMP
和ON UPDATE CURRENT_TIMESTAMP
属性。updated_at
列将允许NULL
,且没有默认时间戳行为。
explicit_defaults_for_timestamp = ON
:created_at
和updated_at
列都不会有默认的时间戳行为,它们将表现得像普通的DATETIME
列一样,除非你显式地为它们指定了DEFAULT
或ON UPDATE
子句。
CREATE TABLE `tablename` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
……
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
……
) COMMENT = 'xxxx';
修改该参数
在配置文件中设置:
在 MySQL 配置文件中(如my.cnf
或my.ini
),添加或修改以下行:[mysqld] explicit_defaults_for_timestamp = ON
然后重启 MySQL 服务器。
在服务器启动时设置:
通过命令行参数启动 MySQL 服务器:mysqld --explicit_defaults_for_timestamp=ON
在运行时动态修改:
通过 SQL 语句在运行时修改(注意,这仅影响当前会话):SET GLOBAL explicit_defaults_for_timestamp = ON; -- 全局级别,需要适当权限 SET SESSION explicit_defaults_for_timestamp = ON; -- 会话级别
了解并正确设置 explicit_defaults_for_timestamp
参数,有助于避免在使用 TIMESTAMP
列时出现意外的行为。