mysql updated_at использует миллисекунды с EPOCH по умолчанию ON UPDATE - PullRequest
0 голосов
/ 23 октября 2019

В моем приложении я использую Sequelize. Теперь я хочу использовать миллисекунды с EPOCH для столбца updated_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 использовал текущее значение в миллисекундах?

1 Ответ

0 голосов
/ 31 октября 2019

значение по умолчанию в 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.

Ваша таблица станет такой с точностью до 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  ;

Aпример с sqlfiddle (http://sqlfiddle.com/#!9/3a85ff/1)

...