我想创建一个表,其中既有"已创建"列,另有"已更新"列."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)
两者都不必显式设置"已创建"列或设置(或重置)插入或更新语句中的"已更新"列.
试试这个来创建你的表:
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)
您创建和更新的字段将被适当设置.
| 归档时间: |
|
| 查看次数: |
10126 次 |
| 最近记录: |