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"。排队和出队的工作可能成为一种负担,尤其是在最终情况下。
我正在处理一个使用 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"。排队和出队的工作可能成为一种负担,尤其是在最终情况下。