2015-04-15 76 views
0

我有这张带有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) 
    ); 

这种情况下的最佳做法是什么?

+1

http://dev.mysql.com/doc/refman/5.6/en/triggers.html –

+0

可能是http://stackoverflow.com/questions/2045745/mysql-update-的欺骗timestamp-column-trigger – NinjaCat

+0

你有没有在搜索过类似的问题?实际上有吨。 – Rahul

回答

1

只能在一个表中使用上一个时间戳列的DEFAULT CURRENT_TIMESTAMPON 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值到当前时间戳自动分配给该列。

MySQL的文档上Automatic Initialization and Updating for TIMESTAMP

它不需要在被 自动初始化或更新为当前的时间戳表中的第一个TIMESTAMP列。 但是,要指定自动初始化或更新 不同的TIMESTAMP列,必须先禁止第一个自动属性 。然后,对于另一个TIMESTAMP列, DEFAULT和ON UPDATE子句的规则与第一个 TIMESTAMP列的规则相同,只是如果省略两个子句,则不会自动初始化或更新 。

为了抑制对第一时间戳列自动属性,执行 下列之一:

  • 定义与指定的恒定默认值的DEFAULT子句的列。
  • 指定NULL属性。这也会导致列允许NULL值,这意味着您无法通过将列设置为NULL来分配当前时间戳。分配NULL将列设置为NULL。
3

考虑使用触发器。 From MySQL docs

触发器是一个与表关联的命名数据库对象,当表发生特定事件时会激活该对象。触发器的一些用途是执行要插入到表中的值的检查或对更新中涉及的值执行计算。触发器的

实施例:

CREATE TRIGGER trigger_example AFTER UPDATE ON news 
FOR EACH ROW UPDATE some_table SET another_column = NEW.data;