MySQL update_at使用毫秒,因为EPOCH作为默认的ON UPDATE

问题描述 投票:0回答:1

在我的应用中,我正在使用Sequelize。现在,我想将EPOCH以来的毫秒数用于update_at列,因此它看起来像:

-------------
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 datetime sequelize.js milliseconds
1个回答
0
投票

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添加精度。

您的表格将以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)的示例

© www.soinside.com 2019 - 2024. All rights reserved.