0

我对带有句点的 Oracle 表的主键有疑问。

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

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
);

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

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

第一个:声明

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”列。但是,我的问题是因为这两行是不同时期的,应该允许吗?

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

提前致谢!

4

2 回答 2

1

问题与您所说的 id 列有关。由于主键是唯一的,因此无法添加注册表,那么您的第二个插入语句引用第一个中的相同 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/

于 2020-03-12T01:42:36.840 回答
0

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

非常感谢!

于 2020-03-12T02:02:19.653 回答