我正在处理使用MariaDB模拟队列的遗留应用程序。缺少的一个关键事项是原始设计没有插入队列中的消息插入的时间,这意味着不保证处理消息的顺序。
到目前为止,消息似乎是按顺序处理的,因为我们只使用一个MariaDB实例,但我想添加一个created_on列以确保继续。
我的问题是我需要回填created_on列,我想知道MariaDB是否存储了给定行插入数据库的时间?
我意识到除非它在模式中,否则不太可能,但偶尔数据库会有非标准的扩展来捕获这种东西。例如,Oracle具有与此类似的功能。
答案 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
字段,但只有一个字段
这些可以使用当前更新时间自动更新。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字段,则会将其设置为当前时间戳。