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

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

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

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

感谢您的帮助。

【问题讨论】:

    标签: hsqldb


    【解决方案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:感谢您的确认,我们找不到比您更好的验证...