【问题标题】:Does MariaDB store a timestamp when a given row is inserted?MariaDB 是否在插入给定行时存储时间戳?
【发布时间】:2015-03-26 17:50:19
【问题描述】:

我正在处理一个使用 MariaDB 来模拟队列的遗留应用程序。缺少的关键之一是原始设计没有插入队列中消息的插入时间,这意味着无法保证消息的处理顺序。

到目前为止,消息似乎是按顺序处理的,因为我们只使用一个 MariaDB 实例,但我想添加一个 created_on 列以确保继续进行。

我的问题是我需要回填 created_on 列,我想知道 MariaDB 是否存储了给定行插入数据库的时间?

我意识到,除非它在架构中,否则不太可能,但有时数据库会有非标准扩展来捕获这类事情。例如,Oracle 具有与此类似的功能。

【问题讨论】:

  • “我意识到,除非它在架构中,否则不太可能,但偶尔数据库会有非标准扩展来捕获这类事情”我很清楚我可以创建一个列来捕获时间戳,我的问题是 MariaDB 是否自己捕获了这个。

标签: mysql sql mariadb


【解决方案1】:

MariaDB 没有隐藏的时间戳。如果表有 AUTO_INCREMENT,这可能就足够了,因为您要求的是订单,而不是具体的时间。

我对通过 MySQL/MariaDB 排队的看法:“不要排队,就去做”。排队和出队的工作可能会成为一种负担,尤其是在最终情况下。

【讨论】:

  • 同意我们不应该将 MariaDB 用作队列,因为我们实际上是在重新创建您从数据库中的标准 MQ 实现中获得的东西。不幸的是,我们无法在代码案例的当前点进行全面的架构更改。
  • 接受这个答案,因为它实际上回答了我的问题。谢谢
【解决方案2】:

是的,如果您要创建一个字段,请确保在创建该字段时您具有以下内容:

create table test_created_on_table( 
  created_on timestamp default now() on update now() 
);

如果您已经有一个字段,只需取消已创建字段上的"CURRENT_TIMESTAMP" 标志。每当您在表中创建新记录时,只需使用 "NOW()" 作为值即可。

或者。

相反,删除'ON UPDATE CURRENT_TIMESTAMP' 标志并为该字段发送NOW()。这种方式实际上更有意义。

这将跟踪插入或更新行的时间。

db trigger 还有另一种方法:

添加修改时间

将修改后的时间戳添加到表中是最直接的。您只需创建TIMESTAMP类型的字段,默认情况下,当行被修改时,MySQL会自动更新该字段。

有几点需要注意:

  • 虽然您可以连续拥有多个 TIMESTAMP 字段,但其中只有一个 这些可以根据当前更新时间自动更新。
  • 如果您的 UPDATE 查询包含 ModifiedTime 字段的值, 将使用此值。

因此,要将修改后的时间戳字段添加到现有表中,您只需要:

ALTER TABLE my_table ADD ModifiedTime TIMESTAMP;

添加 CreatedTime

添加CreateTime 值有点复杂。

在最新版本的 MySQL 上,显然可以创建一个默认值为 CURRENT_TIMESTAMP. 的 DateTime 字段。较新版本的 MySQL 不可能有多个字段使用 CURRENT_TIMESTAMP,我们当然是为了让 ModifiedTime 工作。

因此,为了获得创建的时间戳,首先我们必须在表中添加一个 DATETIME 字段。

ALTER TABLE my_table ADD CreatedTime datetime NOT NULL;

请注意,必须将其创建为 NOT NULL 才能使下一部分工作(这是因为设置 NOT NULL 会强制自动全零默认)。

接下来,我们必须创建一个触发器,它会在我们向表中插入一个值并设置创建的时间戳时自动触发。

DELIMITER //
DROP TRIGGER IF EXISTS my_table_insert_trigger//
CREATE TRIGGER my_table_insert_trigger
BEFORE INSERT ON my_table
FOR EACH ROW
BEGIN
IF NEW.CreatedTime = '0000-00-00 00:00:00' THEN
SET NEW.CreatedTime = NOW();
END IF;
END;//
DELIMITER ; 

现在,当您向表中插入一个值时,该触发器将触发,如果您没有在插入查询中提供 CreatedTime 字段,它将被设置为当前时间戳。

【讨论】:

  • 这就是我们要做的清理它。我的问题是是否存在一种方法来说明插入给定行的时间。
  • 不,它没有。 mysql posgres 或 ms sql 也没有。您必须跟踪自己的行插入。否则,您需要创建一个脚本来支持所有这些日期。 Oracle 可能有这个功能,它更大、更昂贵并且是企业级的。
猜你喜欢
  • 1970-01-01
  • 2014-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-06
相关资源
最近更新 更多