本文由大模型生成。
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 列时出现意外的行为。



