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

Does MariaDB store a timestamp when a given row is inserted?

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

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

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

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

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

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

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

或者。

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

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

还有另一种通过数据库触发器实现的方法:

添加 ModifiedTime

将修改后的时间戳添加到 table 是最直接的。您所要做的就是创建TIMESTAMP类型的字段,默认情况下,MySQL会在修改行时自动更新该字段。

有几件事需要注意:

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

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

ALTER TABLE my_table ADD ModifiedTime TIMESTAMP;

添加 CreatedTime

添加 CreateTime 值有点复杂。

在 MySQL 的最新版本中,显然可以创建一个默认值为 CURRENT_TIMESTAMP. 的 DateTime 字段 这对我来说不是一个选择,因为我不得不支持一些旧版本,此外,即使在 MySQL 的较新版本上,也不可能有多个字段使用 CURRENT_TIMESTAMP,当然我们这样做是为了让 ModifiedTime 工作。

因此,为了获得创建的时间戳,首先我们必须在 table.

中添加一个 DATETIME 字段

ALTER TABLE my_table ADD CreatedTime datetime NOT NULL;

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

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

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 ; 

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

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

我对MySQL/MariaDB排队的看法:"Don't queue it, just do it"。排队和出队的工作可能成为一种负担,尤其是在最终情况下。