Mysql不允许在同一个数据库表中有两个自动更新时间戳列。但是,很多人都喜欢创造"和"更新"他们的表的列,因为这种信息是有用的,所以必须有一些解决方法。根据我收集的内容,一列必须是日期时间,另一列必须是时间戳。 datetime列可以用作创建的列,当默认为null时,在插入触发器时,它将自动获取当前时间戳值。 timestamp列可以作为更新列,可以配置为mysql文档描述的自动更新。这两页有助于理解这一点:
Mysql Datetime and Timestamp Types
Auto Initialization and Updated for Timestamp
使用drupal的架构函数实现这一点变得棘手。有人在drupal 7中找到了成功的解决方案吗?
答案 0 :(得分:3)
在使用了许多其他stackoverflow问题/答案的语法和不同建议后,我终于找到了正确的小代码组合组合,在我的数据库表中自动“创建”和“更新”列。
在我的hook_schema()函数中:
$schema['table'] = array(
'fields' => array(
'created' => array(
'mysql_type' => 'datetime',
'not null ' => TRUE,
'default' => format_date(time(), 'custom', 'Y-m-d 00:00:00'),
),
'updated' => array(
'mysql_type' => 'timestamp',
'not null' => TRUE,
),
),
//other parts of the schema (indexes, keys...)
);
在我的hook_install()函数中:
//Automatically set created datetime for current timestamp upon insert
$query = db_query('
CREATE TRIGGER triggername BEFORE INSERT ON tablename FOR EACH ROW BEGIN SET
NEW.created=NOW(); END
');
//Automatically update 'updated' to current timestamp whenever a row is changed
$query = db_query('
ALTER TABLE tablename
MODIFY updated TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
');
'triggername'是您想要为触发器命名的任何内容。 'tablename'是您在hook_schema()中建立的表的名称,该表具有已创建和更新的列。
希望这对某人有用。几周前,当我对此进行调查时,没有人在drupal中执行此操作,并且很难弄清楚如何使不同的建议适应drupal框架。这是我想出的最佳解决方案。如果你有另一个你认为更好的,请继续发布!
答案 1 :(得分:0)
触发!谢谢!唯一一个在自己的模块中安装触发器的人。 你节省了我的一天。
* Implementation of hook_install()
* @see http://api.drupal.org/api/function/hook_install/
* this is called when a module is installed, providing a chance
* to create any database tables specific our module
*/
function upgrade_inforegistration_install()
{
$query = db_query('
CREATE TRIGGER `mydb`.`mytriggername`
AFTER INSERT ON `mytrigtable`
FOR EACH ROW
BEGIN
INSERT INTO `mydb`.`myaffectedtable`
(`day`, `uid`, `anotherfield`)
VALUES (UNIX_TIMESTAMP(NOW()), NEW.uid, `1`);
END
');
}
答案 2 :(得分:0)
{{1}}
将这两个方法写入moduleName.install文件。
如果您已安装并重新安装以查看效果,请卸载模块。
我在drupal 8.2.3中检查了它,它正在工作。我对drupal 7不太确定。
当添加一行时,它将存储当前日期时间(格式 - > 2017-01-19 15:23:47),如果该行获得更新,将会更新。