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帮助文档对于这个问题的解释。

转载于:https://www.cnblogs.com/ryanzheng/p/11495229.html

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值