1

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

Mysql 日期时间和时间戳类型

自动初始化和更新时间戳

棘手的地方是使用drupal 的模式函数来实现它。有没有人在 drupal 7 中找到了成功的解决方案?

4

3 回答 3

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
');

“触发器名称”是您想要命名触发器的任何名称。'tablename' 是您在 hook_schema() 中建立的表的名称,其中包含已创建和更新的列。

希望这对某人有用。几周前我在研究这个问题时,没有人在 drupal 中做这件事的帖子,而且很难弄清楚如何使不同的建议适应 drupal 框架。这是我想出的最好的解决方案。如果您有另一个您认为更好的帖子,请继续发布!

于 2013-07-16T02:18:26.140 回答
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
    ');
}
于 2015-02-11T18:44:05.313 回答
0
function moduleName_schema() {
    $schema['tableName'] = array(
        'fields' => array(
            'id' => array(
                'type' => 'serial',
                'not null' => TRUE,
            ),
            'colName' => array(
                'mysql_type' => 'timestamp',
                'not null' => TRUE
            ),
            ....other fields..
            ....
        ),
        'primary key' => array('id'),
    );
    return $schema;
}


function bd_contact_enable() {
  db_query('
    ALTER TABLE {bd_contact} 
    MODIFY created TIMESTAMP NOT NULL 
    DEFAULT CURRENT_TIMESTAMP 
    ON UPDATE CURRENT_TIMESTAMP'
  );
}

将这两个方法写入 moduleName.install 文件中。

如果您已经安装并重新安装以查看效果,请卸载您的模块。

我已经在 drupal 8.2.3 中检查过它,它正在工作。我不确定drupal 7。

它将在添加一行时存储当前日期时间(格式-> 2017-01-19 15:23:47),如果该行得到更新,它将得到更新。

于 2017-01-19T10:17:10.200 回答