我有这个表与newspost,我想添加日期添加时间戳,我想在编辑帖子时更新另一个col。我希望它在MySql中自动发生。不使用任何PHP代码。
CREATE TABLE IF NOT EXISTS news (
id int(11) NOT NULL AUTO_INCREMENT,
data text,
date_published timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
date_edited timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id)
);
在这种情况下,最佳做法是什么?
答案 0 :(得分:3)
考虑使用触发器。来自MySQL docs:
触发器是与表关联的命名数据库对象,并在表发生特定事件时激活。触发器的一些用途是执行对要插入表中的值的检查,或者对更新中涉及的值执行计算。
触发器示例:
CREATE TRIGGER trigger_example AFTER UPDATE ON news
FOR EACH ROW UPDATE some_table SET another_column = NEW.data;
答案 1 :(得分:1)
您只能在表格的一个时间戳列中使用DEFAULT CURRENT_TIMESTAMP
和ON UPDATE CURRENT_TIMESTAMP
功能。
使用下表定义关闭date_published的功能并将其用于date_edited:
CREATE TABLE IF NOT EXISTS news (
id INT(11) NOT NULL AUTO_INCREMENT,
data TEXT,
date_published TIMESTAMP NOT NULL DEFAULT 0,
date_edited TIMESTAMP NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id)
);
插入新行时,为date_published传递NULL
值,以自动将当前时间戳分配给该列。
Automatic Initialization and Updating for TIMESTAMP上的MySQL文档:
它不一定是表中的第一个TIMESTAMP列 自动初始化或更新为当前时间戳。 但是,要为a指定自动初始化或更新 不同的TIMESTAMP列,必须禁止自动属性 对于第一个。然后,为其他TIMESTAMP列,规则 DEFAULT和ON UPDATE子句与第一个子句相同 TIMESTAMP列,但如果省略两个子句,则不会自动 发生初始化或更新。
要抑制第一个TIMESTAMP列的自动属性,请执行此操作 以下任一项:
- 使用DEFAULT子句定义列,该子句指定常量默认值。
- 指定NULL属性。这也会导致列允许NULL值,这意味着您无法通过将列设置为NULL来分配当前时间戳。分配NULL会将列设置为NULL。