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()
如果您想要毫秒或微秒,则必须为 datetime
和 current_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)
在我的应用程序中,我使用的是 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()
如果您想要毫秒或微秒,则必须为 datetime
和 current_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)