mysql未按预期执行当前的\u时间戳更新

e37o9pze  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(297)

经过大量的研究和这里提出的几个类似的问题,我得出了一些结论,但一如既往,还有更多的问题。
这涉及到\u timestamp的显式\u默认值\u
假设关闭了\u timestamp的显式\u defaults\u,这将起作用:
架构:

CREATE TABLE IF NOT EXISTS `updated_tables` (
  `table_name` VARCHAR(50) NOT NULL,
  `updated_at` TIMESTAMP(6)  NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
  PRIMARY KEY (`table_name`),
  UNIQUE INDEX `table_name_UNIQUE` (`table_name` ASC))
  ENGINE = InnoDB;

以及查询:

INSERT INTO `updated_tables` (`table_name`,`updated_at`) VALUES ('products',NULL) ON DUPLICATE KEY UPDATE `table_name`=VALUES(`table_name`), `updated_at`=VALUES(`updated_at`);

第一次发送查询时,表将填充“products”和当前时间戳。如果我重复查询,那么字段'updated\u at'将被更新。根据定义,当我发送null值时,即使不允许,mysql也会更新列。一切正常,一切正常。
假设我打开了显式的\u defaults \u for \u timestamp如果我使用上面的查询,它会抱怨不允许空值,这符合规则。
问题是,在启用显式的\u defaults \u for \u timestamp的情况下,如何具有相同的功能?有一种解决方案可以引入额外的列(varchar),例如以毫秒为单位保存时间戳。当我更新它时,mysql会相应地更新更新的\u。但这看起来有点过头了,我还是手动更新更新后的\u为好。我想把责任转移到mysql级别,而不是按程序来做。
简言之,如何对表\u名称执行更新,并正确设置更新后的\u。这里的诀窍是我有很多更新(缓存表),但实际上从来没有改变表名值。
有可能吗?或者我必须为时间戳关闭显式\u默认值\u?
关掉它是个错误的决定吗?看这篇文章似乎是好的,但我不确定。
附带问题:
如果我决定自己执行更新,那么构建它的方法是什么?目前mysql current\u timestamp(6)有这样的构造:2018-07-10 11:32:43.490100我如何用javascript创建相同的构造?我想到的第一件事是得到当前日期,并将当前时间戳的最后6位数字附加到它后面。

q8l4jmvw

q8l4jmvw1#

可以在插入时创建触发器,并始终设置 updated_at 使用当前的时间戳-最干净的方法,但这可能会减慢更新速度。以编程方式设置列值比触发触发器要快。
如果您是从node.js执行查询,那么您可以使用 new Date().getTime() 以毫秒为单位获取unix时间戳,然后像这样构造查询

UPDATE tbl SET col_1 = val_1, col_2 = val_2, updated_at = FROM_UNIXTIME(js_milliseconds / 1000) 
WHERE id = desired_id

相关问题