zoukankan      html  css  js  c++  java
  • MySQL there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause同时创建多个更新当前时间戳字段 解决方法

    问题重现

    在写这篇文章之前,明确我的MySQL版本,MariaDB 或者你使用 MySQL 8 也会出现如下问题

    MySQL 版本

    现在有这样的需求,一张表中有一个字段created_at记录创建该条记录的时间戳,另一个字段updated_at记录更新该条记录的时间戳。
    我们尝试创建以下语句。

    CREATE TABLE temp
    (
        id INT(11) PRIMARY KEY AUTO_INCREMENT,
        name VARCHAR(10),
        created_at timestamp NULL DEFAULT CURRENT_TIMESTAMP,
        updated_at timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
    );

    执行后报错:

    报ERROR 1293 (HY000)错误。(完整错误信息:ERROR 1293 (HY000): Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause)

    解决方案一

    第一种,created_at 使用 DEFAULT CURRENT_TIMESTAMP 或者 DEFAULT now(),而 updated_at 使用触发器。

    CREATE TABLE temp
    (
        id INT(11) PRIMARY KEY AUTO_INCREMENT,
        name VARCHAR(10),
        created_at timestamp NULL DEFAULT CURRENT_TIMESTAMP,
        updated_at timestamp NULL
    );

    在temp上创建触发器,实现更新时记录更新时间

    delimiter |
    DROP TRIGGER IF EXISTS tri_temp_updated_at;
    CREATE TRIGGER tri_temp_updated_at BEFORE UPDATE ON temp
    FOR EACH ROW
    BEGIN
        SET NEW.updated_at = now();
    END;
    |
    delimiter ;

    解决方案二

    第二种,created_at使用触发器,updated_at使用DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP或者DEFAULT now() ON UPDATE now();

    CREATE TABLE temp
    (
        id INT(11) PRIMARY KEY AUTO_INCREMENT,
        name VARCHAR(10),
        created_at timestamp NULL,
        updated_at timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
    );

    在temp上创建触发器,实现插入数据记录创建时间

    delimiter |
    DROP TRIGGER IF EXISTS tri_temp_created_at;
    CREATE TRIGGER tri_temp_created_at BEFORE INSERT ON temp
    FOR EACH ROW
    BEGIN
        IF new.created_at IS NULL
        THEN
            SET new.created_at=now();
        END IF;
    END;
    |
    delimiter ;

    解决方案三

    第三种,created_at 指定 timestamp DEFAULT ‘0000-00-00 00:00:00’,updated_at 指定 DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 或者 timestamp DEFAULT now() ON UPDATE now();

    CREATE TABLE temp
    (
        id INT(11) PRIMARY KEY AUTO_INCREMENT,
        name VARCHAR(10),
        created_at timestamp NULL DEFAULT '0000-00-00 00:00:00',
        updated_at timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
    );

    插入数据:

    mysql> INSERT INTO temp(name,created_at,updated_at) 
    VALUES('robin',now(),now());
    Query OK, 1 row affected (0.01 sec)
    
    mysql> INSERT INTO temp(name,created_at,updated_at) 
    VALUES('wentasy',now(),now());
    Query OK, 1 row affected (0.01 sec)

    解决方案四

    第四种,更换MySQL版本,MySQL 5.6已经去除了此限制。

    我们可以看下MySQL 5.5和5.6帮助文档对于这个问题的解释。

  • 相关阅读:
    Python修饰符实践
    回文
    Linux下安装Qt
    Linux下安装PyQT
    Python闭包实践
    杂乱
    windows下脚本转到linux下,文件保存格式要转换
    lua table.sort的bug
    shell截取某段
    coredump
  • 原文地址:https://www.cnblogs.com/ryanzheng/p/11495229.html
Copyright © 2011-2022 走看看