我对带句号的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”列。但是,我的问题是因为这两行的时间不同,应该允许吗?
我打算利用这段时间来捕获记录的更改历史记录,以作为闪回的替代方法。但是,这是否意味着在这种情况下我不应该使用主键?
提前感谢!
问题与您所说的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/
感谢大家对此的帮助。这很可能意味着我无法使用主键/外键来维护父级和子级之间在特定时间戳下我的情况的参照完整性,但我必须采取其他措施。
非常感谢!