mysql updated_at 在更新时使用自 EPOCH 以来的毫秒数作为默认值

mysql updated_at use milliseconds since EPOCH as default ON UPDATE

在我的应用程序中,我使用的是 Sequelize。现在我想为 updated_at 列使用自 EPOCH 以来的毫秒数,这样它看起来像:

-------------
updated_at
-------------
1571838511364
-------------

数据定义现在看起来像:

CREATE TABLE `projects` (
   `id` char(36) NOT NULL,
   `name` varchar(45) NOT NULL,
   `description` varchar(450) NOT NULL,
   `active` tinyint(1) NOT NULL DEFAULT '1',
   `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
   `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
   PRIMARY KEY (`id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

我已经对 created_at 做了这个,因为使用 Sequelize 很容易设置默认值,但是对于 updated_at,我如何设置 ON UPDATE 的默认值?

我知道 SELECT UNIX_TIMESTAMP(current_timestamp()) 会给我当前的毫秒数,所以我有:

updatedAt: {
      type: Sequelize.STRING,
      allowNull: false,
      defaultValue: Sequelize.literal(
        'UNIX_TIMESTAMP(current_timestamp()) ON UPDATE UNIX_TIMESTAMP(current_timestamp())'
      ),
    },

这会给我错误:

Executing:
ALTER TABLE `ab`.`projects` 
CHANGE COLUMN `updated_at` `updated_at` VARCHAR(45) NOT NULL DEFAULT UNIX_TIMESTAMP(current_timestamp()) ON UPDATE UNIX_TIMESTAMP(current_timestamp()) ;

ERROR 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UNIX_TIMESTAMP(current_timestamp()) ON UPDATE UNIX_TIMESTAMP(current_timestamp()' at line 2

我也试过默认值是: 'UNIX_TIMESTAMP ON UPDATE UNIX_TIMESTAMP' 但我还是遇到了同样的 sql 错误。

如何实现我的目标,以便 ON UPDATE 使用当前的毫秒值?

mysql 中的默认值必须是文字,唯一的例外是使用 CURRENT_TIMESTAMP()。

https://dev.mysql.com/doc/refman/5.6/en/data-type-defaults.html#data-types-defaults-explicit

unix_timestamp(CURRENT_TIMESTAMP()) 不同于 CURRENT_TIMESTAMP()

如果您想要毫秒或微秒,则必​​须为 datetimecurrent_timestamp 添加精度。

你table会变成这个,精度为4位数。

CREATE TABLE `projects` (
   `id` char(36) NOT NULL,
   `name` varchar(45) NOT NULL,
   `description` varchar(450) NOT NULL,
   `active` tinyint(1) NOT NULL DEFAULT '1',
   `created_at` datetime(4) NOT NULL DEFAULT CURRENT_TIMESTAMP(4),
   `updated_at` datetime(4) NOT NULL DEFAULT CURRENT_TIMESTAMP(4) ON UPDATE CURRENT_TIMESTAMP(4),
   PRIMARY KEY (`id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4  ;

sqlfiddle 示例 (http://sqlfiddle.com/#!9/3a85ff/1)