在Oracle SQL中为带有周期(临时有效期)的表创建主键

问题描述 投票:0回答:2

我对带句号的Oracle Table的主键有疑问。

我创建了两个表,如下所示:

create table el_temporal_try( -- Parent Table
    id number(10) not null,
    ColumnA varchar(10),
    constraint el_temporal_try_pk primary key (id),
    period for valid_period
);
create table el_temporal_try_son( -- Son Table
    id number(10) not null,
    ColumnA varchar(10),
    parent_id number(10),
    constraint el_temporal_try_FY foreign key (parent_id) references el_temporal_try(id),
    period for valid_period
);

此脚本成功通过。但是我在插入数据时遇到问题:

我已经在父表中执行了以下两个插入语句:

1st:陈述

insert into el_temporal_try 
(id, columnA,valid_period_start, valid_period_end)
values
(1,'A',sysdate - 10, sysdate - 9);

结果:

已插入1行。

第二:陈述

insert into el_temporal_try 
(id, columnA,valid_period_start, valid_period_end)
values
(1,'B',sysdate - 8, sysdate - 7);

结果

ORA-00001:唯一约束(PBSVW.EL_TEMPORAL_TRY_PK)被违反

我了解这是因为“ ID”列。但是,我的问题是因为这两行的时间不同,应该允许吗?

我打算利用这段时间来捕获记录的更改历史记录,以作为闪回的替代方法。但是,这是否意味着在这种情况下我不应该使用主键?

提前感谢!

sql oracle primary-key sql-insert temporal-tables
2个回答
0
投票

问题与您所说的id列有关。因为主键是唯一的,所以无法添加注册表,因此您的第二个insert语句引用的ID与第一个相同。总是在插入一行时更改ID。

在Oracle 12c上,您可以使用类似于此链接的标识。https://www.oracletutorial.com/oracle-basics/oracle-identity-column/

在另一个版本中,您可以使用序列和触发器来执行此操作。https://chartio.com/resources/tutorials/how-to-define-an-auto-increment-primary-key-in-oracle/


0
投票

感谢大家对此的帮助。这很可能意味着我无法使用主键/外键来维护父级和子级之间在特定时间戳下我的情况的参照完整性,但我必须采取其他措施。

非常感谢!

© www.soinside.com 2019 - 2024. All rights reserved.