Mysql不允许在同一数据库表中有两个自动更新时间戳列。但是,许多人喜欢为他们的表“创建”和“更新”列,因为这种信息很有用,所以必须有一些解决方法。根据我收集的内容,一列必须是日期时间,另一列必须是时间戳。datetime 列可以用作创建的列,当默认为 null 时,使用触发器插入时,它将自动采用当前时间戳值。时间戳列可以用作更新的列,并且可以配置为按照mysql文档的描述自动更新。这两个页面对于理解这一点很有用:
MySQL日期时间和时间戳类型
自动初始化并更新时间戳
它变得棘手的地方是使用Drupal的模式函数实现它。有人在Drupal 7中找到了成功的解决方案吗?
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。
它将存储当前日期时间(格式化-
触发非常感谢。唯一一个在自己的模块中安装触发器的人。你救了我一天。
* 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
');
}
在玩味了语法和来自许多其他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
问题内容: 我正在尝试创建一个新表,该表将包含三个现有表中的选定数据。 现有的三个表设置如下,我想要的结果在底部: 在此先感谢您的帮助! 问题答案: 您需要进行三向联接: 演示 或者,如果您已经创建了表,则可以执行以下操作: 要获得多个属性,您必须分别为每个属性将详细信息和分类表联接在一起: