一个表中有两个MySQL时间戳列

Ken*_*ogt 9 mysql

我想创建一个表,其中既有"已创建"列,另有"已更新"列."created"列将设置为insert并且永不更改.每次更新行时,"已更新"列都会更改.我不想在后续的INSERT或UPDATE语句中混淆这些列中的任何一个.那么如果我从这样的东西开始,我的CREATE TABLE语句应该是什么样的?

CREATE TABLE IF NOT EXISTS `mydb`.`mytable` (
  `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `updated` TIMESTAMP,
  `created` TIMESTAMP,
  `deleted` TINYINT DEFAULT 0,
  `notes` TEXT DEFAULT '',
  `description` VARCHAR(100)
) TYPE=innodb;
Run Code Online (Sandbox Code Playgroud)

我似乎无法创建一个包含两个TIMESTAMP列的表.我不关心列是TIMESTAMP还是DATETIME或者其他什么,我只是希望它们由MySQL填充而没有来自insert或update语句的明确指令.

我希望能够像这样插入:

INSERT INTO `mydb`.`mytable` (notes,description) VALUES ('some note','some description');
Run Code Online (Sandbox Code Playgroud)

和这样的更新:

UPDATE `mydb`.`mytable` SET notes=CONCAT(notes,'some more notes') WHERE id=1;
Run Code Online (Sandbox Code Playgroud)

两者都不必显式设置"已创建"列或设置(或重置)插入或更新语句中的"已更新"列.

jam*_*ond 7

试试这个来创建你的表:

CREATE TABLE IF NOT EXISTS db.test_table
(
Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
created DATETIME DEFAULT NULL,
updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
deleted TINYINT DEFAULT 0,
notes TEXT DEFAULT NULL,
description VARCHAR(100)
)
Run Code Online (Sandbox Code Playgroud)

注意

updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
Run Code Online (Sandbox Code Playgroud)

将允许自动更新此字段.

在插入记录之前将其设置为触发器:

DELIMITER $$

CREATE
    /*[DEFINER = { user | CURRENT_USER }]*/
    TRIGGER `db`.`on_before_insert` BEFORE INSERT
    ON `db`.`test_table`
    FOR EACH ROW BEGIN
    SET new.created = NOW();    
    END$$

DELIMITER ;
Run Code Online (Sandbox Code Playgroud)

然后你可以使用它来插入:

INSERT INTO db.test_table(description) VALUES ("Description")
Run Code Online (Sandbox Code Playgroud)

并更新您的记录

UPDATE db.test_table SET description = "Description 2" where Id=1
Run Code Online (Sandbox Code Playgroud)

您创建和更新的字段将被适当设置.