0%

Flink-temporal-table-join

Flink-temporal-table-join

Temporal Table记录了表历史上任何时间点所有的数据改动

ANSI-SQL 2011 Temporal Table示例

我们以一个DDL和一套DML示例说明Temporal Table的原理,DDL定义PK是可选的,下面的示例我们以不定义PK的为例进行说明:

  • DDL 示例
1
2
3
4
5
6
7
8
9
CREATE TABLE Emp
ENo INTEGER,
Sys_start TIMESTAMP(12) GENERATED
ALWAYS AS ROW START,
Sys_end TIMESTAMP(12) GENERATED
ALWAYS AS ROW END,
EName VARCHAR(30),
PERIOD FOR SYSTEM_TIME (Sys_start,Sys_end)
) WITH SYSTEM VERSIONING
  • DML 示例
    • INSERT
1
INSERT INTO Emp (ENo, EName) VALUES (22217, 'Joe')

说明: 其中Sys_Start和Sys_End是数据库系统默认填充的。

    • UPDATE
1
UPDATE Emp SET EName = 'Tom' WHERE ENo = 22217

说明: 假设是在 2012-02-03 10:00:00 执行的UPDATE,执行之后上一个值 "Joe" 的Sys_End值由 9999-12-31 23:59:59 变成了 2012-02-03 10:00:00 , 也就是下一个值 "Tom" 生效的开始时间。可见我们执行的是UPDATE但是数据库里面会存在两条数据,数据值和有效期不同,也就是版本不同 。

  • DELETE (假设执行DELETE之前的表内容如下)

DELETE FROM Emp WHERE ENo = 22217

说明: 假设我们是在 2012-06-01 00:00:00 执行的DELETE,则Sys_End值由 9999-12-31 23:59:59 变成了 2012-06-01 00:00:00 , 也就是在执行DELETE时候没有真正的删除符合条件的行,而是系统将符合条件的行的Sys_end修改为执行DELETE的事物时间。标识数据的有效期到DELETE执行那一刻为止。

  • SELECT
1
2
SELECT ENo,EName,Sys_Start,Sys_End FROM Emp
FOR SYSTEM_TIME AS OF TIMESTAMP '2011-01-02 00:00:00'

说明: 这个查询会返回所有 Sys_start <= 2011-01-02 00:00:00 并且 Sys_end > 2011-01-02 00:00:00 的记录。