mysql表drupal中的“created”和“updated”列

时间:2013-07-15 15:02:43

标签: mysql datetime drupal timestamp drupal-schema

Mysql不允许在同一个数据库表中有两个自动更新时间戳列。但是,很多人都喜欢创造"和"更新"他们的表的列,因为这种信息是有用的,所以必须有一些解决方法。根据我收集的内容,一列必须是日期时间,另一列必须是时间戳。 datetime列可以用作创建的列,当默认为null时,在插入触发器时,它将自动获取当前时间戳值。 timestamp列可以作为更新列,可以配置为mysql文档描述的自动更新。这两页有助于理解这一点:

Mysql Datetime and Timestamp Types

Auto Initialization and Updated for Timestamp

使用drupal的架构函数实现这一点变得棘手。有人在drupal 7中找到了成功的解决方案吗?

3 个答案:

答案 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),如果该行获得更新,将会更新。