签到成功

知道了

CNDBA社区CNDBA社区

mysql explicit_defaults_for_timestamp 参数说明

2024-12-06 15:14 430 2 转载 MySQL
作者: dave

本文由大模型生成。

explicit_defaults_for_timestamp 是 MySQL 中的一个系统变量,它控制着 TIMESTAMP 列的默认行为和属性。该参数可以在 MySQL 配置文件(如 my.cnfmy.ini)中设置,也可以在服务器启动时通过命令行参数设置,还可以在运行时通过 SQL 语句动态修改。

http://www.cndba.cn/dave/article/131603

作用

  1. 默认行为

    • explicit_defaults_for_timestamp = OFF(MySQL 5.6.6 之前的默认行为):
      • 第一个 TIMESTAMP 列在没有显式指定 NOT NULL 时,默认会被设置为 NOT NULL 并且具有 DEFAULT CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP 属性。
      • 后续的 TIMESTAMP 列则默认允许 NULL
    • explicit_defaults_for_timestamp = ON(MySQL 5.6.6 及之后的默认行为):
      • 所有 TIMESTAMP 列在没有显式指定 DEFAULTON UPDATE 时,都不会有默认的时间戳行为。它们将表现得像其他类型的列一样,除非明确指定了 DEFAULTON UPDATE 子句。
  2. 时间戳属性http://www.cndba.cn/dave/article/131603

    • explicit_defaults_for_timestamp = ON 时,如果你希望 TIMESTAMP 列具有自动更新或默认时间戳的功能,必须显式地指定 DEFAULT CURRENT_TIMESTAMP 和/或 ON UPDATE CURRENT_TIMESTAMP
    • explicit_defaults_for_timestamp = OFF 时,即使不显式指定,第一个 TIMESTAMP 列也会自动具有这些属性。

示例

假设我们有一个表 example_table,定义如下:

http://www.cndba.cn/dave/article/131603

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_TIMESTAMPON UPDATE CURRENT_TIMESTAMP 属性。
    • updated_at 列将允许 NULL,且没有默认时间戳行为。
  • explicit_defaults_for_timestamp = ON

    • created_atupdated_at 列都不会有默认的时间戳行为,它们将表现得像普通的 DATETIME 列一样,除非你显式地为它们指定了 DEFAULTON 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';

修改该参数

  1. 在配置文件中设置
    在 MySQL 配置文件中(如 my.cnfmy.ini),添加或修改以下行:

    http://www.cndba.cn/dave/article/131603
    http://www.cndba.cn/dave/article/131603

    [mysqld]
    explicit_defaults_for_timestamp = ON
    

    然后重启 MySQL 服务器。http://www.cndba.cn/dave/article/131603

  2. 在服务器启动时设置
    通过命令行参数启动 MySQL 服务器:http://www.cndba.cn/dave/article/131603

    http://www.cndba.cn/dave/article/131603

    mysqld --explicit_defaults_for_timestamp=ON
    
  3. 在运行时动态修改
    通过 SQL 语句在运行时修改(注意,这仅影响当前会话):http://www.cndba.cn/dave/article/131603

    SET GLOBAL explicit_defaults_for_timestamp = ON;  -- 全局级别,需要适当权限
    SET SESSION explicit_defaults_for_timestamp = ON; -- 会话级别
    

了解并正确设置 explicit_defaults_for_timestamp 参数,有助于避免在使用 TIMESTAMP 列时出现意外的行为。http://www.cndba.cn/dave/article/131603

用户评论
* 以下用户言论只代表其个人观点,不代表CNDBA社区的观点或立场
dave

dave

关注

人的一生应该是这样度过的:当他回首往事的时候,他不会因为虚度年华而悔恨,也不会因为碌碌无为而羞耻;这样,在临死的时候,他就能够说:“我的整个生命和全部精力,都已经献给世界上最壮丽的事业....."

  • 2261
    原创
  • 3
    翻译
  • 578
    转载
  • 191
    评论
  • 访问:7965277次
  • 积分:4346
  • 等级:核心会员
  • 排名:第1名
精华文章
    最新问题
    查看更多+
    热门文章
      热门用户
      推荐用户
        Copyright © 2016 All Rights Reserved. Powered by CNDBA · 皖ICP备2022006297号-1·

        QQ交流群

        注册联系QQ