[英]Two MySQL timestamp columns in one table
我想创建一个表,其中既有“created”列,又有“updated”列。 “创建”列将在插入时设置并且永远不会更改。 每次更新行时,“已更新”列都会更改。 我不想在随后的 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;
我似乎无法创建包含两个 TIMESTAMP 列的表。 我不在乎这些列是 TIMESTAMP 还是 DATETIME 或其他什么,我只希望它们由 MySQL 填充,而不需要插入或更新语句的明确说明。
我希望能够像这样插入:
INSERT INTO `mydb`.`mytable` (notes,description) VALUES ('some note','some description');
和这样的更新:
UPDATE `mydb`.`mytable` SET notes=CONCAT(notes,'some more notes') WHERE id=1;
两者都无需在插入或更新语句中显式设置“创建”列或设置(或重置)“更新”列。
试试这个来创建你的表:
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)
)
注意
updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
将允许自动更新此字段。
并在插入记录之前将其设置为触发器:
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 ;
然后你可以使用它来插入:
INSERT INTO db.test_table(description) VALUES ("Description")
并更新您的记录
UPDATE db.test_table SET description = "Description 2" where Id=1
并且您创建和更新的字段将被适当地设置。
新闻 flash:在 mysql 中,每次更新行中的任何其他列时, TIMESTAMP
列总是用now()
更新 - 这是此数据类型的特意设计的特性。
另一方面, DATETIME
没有这种奇怪的行为 - 这是完全正常的。
答案: created
必须是DATETIME
,但是由于这个错误,您还需要一个触发器,如下所示:
CREATE TABLE IF NOT EXISTS mytable (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
`updated` TIMESTAMP, -- This will be updated to now(), if you don't set it or set it to null
`created` DATETIME NOT NULL, -- This will never be magically updated once written
`deleted` TINYINT DEFAULT 0,
`notes` TEXT DEFAULT '',
`description` VARCHAR(100)
) TYPE=innodb;
DELIMITER ~
CREATE TRIGGER mytable_insert_trigger
BEFORE INSERT ON mytable
FOR EACH ROW BEGIN
SET NEW.created = CURRENT_TIMESTAMP;
END;~
DELIMITER ;
insert into mytable (notes) values ('test');
select * from mytable;
+----+---------------------+---------------------+---------+-------+-------------+
| id | updated | created | deleted | notes | description |
+----+---------------------+---------------------+---------+-------+-------------+
| 1 | 2011-07-05 11:48:02 | 2011-07-05 11:48:02 | 0 | test | NULL |
+----+---------------------+---------------------+---------+-------+-------------+
尝试这个:
CREATE TABLE IF NOT EXISTS mydb.mytable
(
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
updated DATETIME,
created TIMESTAMP,
deleted TINYINT DEFAULT 0,
notes TEXT DEFAULT '',
description VARCHAR(100)
) TYPE=innodb;
编辑:使用触发器。
CREATE TRIGGER mytable_update
BEFORE UPDATE ON mydb.mytable
FOR EACH ROW SET NEW.updated = NOW();
另一种方法是更改时间戳列的顺序
或者
像这样设置第一列的默认值
ALTER TABLE `tblname` CHANGE `first_timestamp_column`
`first_timestamp_column` TIMESTAMP NOT NULL DEFAULT 0;
不幸的是 MySQL 不允许您在一张表中有两个 TIMESTAMP 列。 我将使用 ON UPDATE CURRENT_TIMESTAMP 作为更新的列,并使用 NOW() function 手动创建设置。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.