当前位置: 首页 > 知识库问答 >
问题:

mysql表Drupal中的“创建”和“更新”列

阎承嗣
2023-03-14

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

MySQL日期时间和时间戳类型

自动初始化并更新时间戳

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

共有3个答案

耿俊
2023-03-14
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。

它将存储当前日期时间(格式化-

费明诚
2023-03-14

触发非常感谢。唯一一个在自己的模块中安装触发器的人。你救了我一天。

         * 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
    ');
}
金飞
2023-03-14

在玩味了语法和来自许多其他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框架中。这是我想到的最好的解决方案。如果你有另一个你认为更好的,那就把它贴出来吧!

 类似资料:
  • 本文向大家介绍如何在MySQL中创建和更新表的日期?,包括了如何在MySQL中创建和更新表的日期?的使用技巧和注意事项,需要的朋友参考一下 使用MySQL中的create_time或update_time获取创建和更新表的确切日期。 首先,使用SHOW命令。语法如下 我们正在考虑我们的数据库“ test3”,该数据库已经有一些表 现在使用以下查询显示数据库test3中的所有表 以下是输出 查询如下

  • 问题内容: 我想定义具有2个TIMESTAMP字段的表,如下所示: 如何避免错误: 重点是保持表架构中和的所需行为。 问题答案: 猜猜这是一个老帖子,但实际上我想mysql在其最新版本中支持2 TIMESTAMP mysql 5.6.25,这就是我目前使用的时间。

  • 我有一个< code>_payments数据库,其中有一个< code>users表,表中有< code>id 、< code >用户名 、< code >密码。密码使用散列盐。我的开发人员不可用,我需要创建一个新用户。为此,我应该运行什么查询?

  • 插入新记录或更新(如果存在)的缩写是什么?

  • 我知道我们可以使用火花jdbc从现有的mysql表中读写数据。但是我们甚至可以创建mysql表并使用数据框插入数据吗?当我尝试加载文件到数据框,并尝试写入不存在的表我面临空指针异常。以下是错误: JAVAorg上的lang.NullPointerException。阿帕奇。火花sql。处决数据源。jdbc。JdbcRelationProvider。在org上创建关系(jdbrelationprov

  • 问题内容: 我正在尝试创建一个新表,该表将包含三个现有表中的选定数据。 现有的三个表设置如下,我想要的结果在底部: 在此先感谢您的帮助! 问题答案: 您需要进行三向联接: 演示 或者,如果您已经创建了表,则可以执行以下操作: 要获得多个属性,您必须分别为每个属性将详细信息和分类表联接在一起: