MariaDB是否在插入给定行时存储时间戳?

时间:2015-03-26 17:50:20

标签: mysql sql mariadb

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

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

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

我意识到除非它在模式中,否则不太可能,但偶尔数据库会有非标准的扩展来捕获这种东西。例如,Oracle具有与此类似的功能。

2 个答案:

答案 0 :(得分:2)

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

我对通过MySQL / MariaDB进行排队的看法:"不要排队,只是这样做"。排队和出队的努力可能成为负担,特别是在最终情况下。

答案 1 :(得分:-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实现:

添加ModifiedTime

向表中添加修改后的时间戳是最直接的。您所要做的就是创建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字段,则会将其设置为当前时间戳。