我有一个表,让我们称之为员工,将数据发送到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
答案 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及更高版本。在此之前,如果您需要这种精确度,请使用触发器。