mysql datetime default 0001-01-01 00:00:00 on update 0001-01-01 00:00:00

时间:2016-08-13 07:30:33

标签: mysql datetime

我有一个表,让我们称之为员工,将数据发送到Web服务器,每当发生这种情况时,使用current_timestamp更新datetime字段。

现在,当记录发生变化时,我想将datetime字段重置为0001-01-01 00:00:00,以便它再次发送新信息。

是否可以执行类似

的操作
DEFAULT 0001-01-01 00:00:00 ON UPDATE 0001-01-01 00:00:00

而不是

DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

1 个答案:

答案 0 :(得分:1)

on update仅支持current_timestamp;不允许其他任何值。见Automatic Initialization and Updating for TIMESTAMP and DATETIME

  

使用DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP特定于TIMESTAMP和DATETIME。 DEFAULT子句也可用于指定常量(非自动)默认值;例如,DEFAULT 0或DEFAULT' 2000-01-01 00:00:00'。

您可以使用after update触发器,但常见的解决方案是使用其他列并在导出时将值设置为current_timestamp并将其与最新更新进行比较:

create table tablename (
   ... 
   updated_at datetime(6) default current_timestamp(6) 
                          on update current_timestamp(6),
   exported_at datetime(6) default '0001-01-01 00:00:00'
)

要获取需要导出的所有行,请使用

select * from tablename where exported_at <> updated_at for update;

要在导出后将某些内容标记为已更新,请使用

update tablename set exported_at = current_timestamp(6);

(交易中的所有内容当然)

感谢Orbit的@Lightness Races指出为什么使用datetime(6)代替datetime并不明显:默认情况下,mysql使用datetime具有第二精度。这通常不是问题 - 但是对于这种检测更改的应用程序,它会错过在导出的1秒内应用的更新,因此与每次更新时将列重置为值的效果略有不同这标志着更新&#34;。这仅适用于mysql 5.6.4及更高版本。在此之前,如果您需要这种精确度,请使用触发器。