如何查询 hsqldb 2.5.1 的系统版本

Posted

技术标签:

【中文标题】如何查询 hsqldb 2.5.1 的系统版本【英文标题】:How to query system versioning of hsqldb 2.5.1 【发布时间】:2020-07-05 13:24:11 【问题描述】:

我提出一个新问题,因为我找不到解决方案。

我想使用 Hsqldb 2.5.1 的系统版本,以便能够在后台任务中复制在两个时间戳定义的时间间隔内发生的表上的任何更改(插入、删除或更新)( timestart 和 timestop)。

假设这是可能的,那么三个查询分别用于查找在时间间隔(timestart、timestop)内由 INSERT、UPDATE 和 DELETE 更改的记录。

感谢您的帮助。

【问题讨论】:

【参考方案1】:

经过大量研究,我发现 3 个查询似乎可以回答我的问题。 欢迎任何更正,SQL 不是我最了解的...

复制间隔由 2 TIMESTAMP WITHOUT TIME ZONE 定义,因为我使用的驱动程序是由 UNO API (OpenOffice / LibreOffice) 提供的驱动程序,而 getter/setter (getTimestamp/setTimestamp) 不管理 TIMESTAMP WITH TIME ZONE ,分别为timestarttimestop

rowstart: 是声明为 TIMESTAMP GENERATED ALWAYS AS ROW START 的列。

rowend: 是声明为 TIMESTAMP GENERATED ALWAYS AS ROW END 的列。

customerid: 是客户表的主键。

要查找已更新的记录:

SELECT current.customerid FROM customer FOR SYSTEM_TIME AS OF timestop + SESSION_TIMEZONE() AS current
INNER JOIN customer FOR SYSTEM_TIME FROM timestart + SESSION_TIMEZONE() TO timestop + SESSION_TIMEZONE() AS previous
ON current.customerid = previous.customerid AND current.rowstart = previous.rowend;

要查找已插入的记录:

SELECT current.customerid FROM customer FOR SYSTEM_TIME AS OF timestop + SESSION_TIMEZONE() current
LEFT JOIN customer FOR SYSTEM_TIME AS OF timestart + SESSION_TIMEZONE() previous
ON current.customerid = previous.customerid WHERE previous.customerid IS NULL;

要查找已删除的记录:

SELECT previous.customerid FROM customer FOR SYSTEM_TIME AS OF timestart + SESSION_TIMEZONE() previous
LEFT JOIN customer FOR SYSTEM_TIME AS OF timestop + SESSION_TIMEZONE() current
ON previous.customerid = current.customerid WHERE current.customerid IS NULL;

我不知道使用 DATABASE_TIMEZONE 代替 SESSION_TIMEZONE 是否更明智,谁想确认...

我没有时间进行大规模测试,但即使有很多记录,它也能快速运行。

等等……

编辑:我刚刚注意到使用 hsqldb 2.5.1 版本很重要,因为我没有设法在 2.5.0 下进行正确操作...

【讨论】:

查询没问题。即使您使用 TIMESTAMP WITHOUT TIME ZONE,它也总是会创建一个 TIMESTAMP WITH TIME ZONE 列,并且每个时间戳的时区都是 UTC。您需要 SESSION_TIMEZONE() 因为 timestart 和 timestop 在您的会话时区中。 对于有大量更新的非常大的表,您可以在(customerid,rowend)列上创建索引,以加快更新记录的查询。 @fredt:感谢您的确认,我们找不到比您更好的验证...

以上是关于如何查询 hsqldb 2.5.1 的系统版本的主要内容,如果未能解决你的问题,请参考以下文章

Hsqldb安装与使用

HSQLDB - 如何设置 .lobs 文件编码?

HSQLDB整型key自动递增

如何查询最近 30 天内添加的产品(HSQLDB)

如何在 Hypersql 数据库(HSQLDB)中选择多列但仅按一列分组?

简单的 Oracle JOIN (+) 到 HSQLDB