在 Oracle SQL 中使用句点(时间有效性)为 table 创建主键
Create primary key for table with period (Temporal Validity) in Oracle SQL
我有一个关于带句点的 Oracle Table 主键的问题。
我创建了两个 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
);
此脚本成功通过。但是我在插入数据时遇到问题:
我已经在父 table 中执行了以下两个插入语句:
第一个:语句
insert into el_temporal_try
(id, columnA,valid_period_start, valid_period_end)
values
(1,'A',sysdate - 10, sysdate - 9);
结果:
1 row inserted.
第二条:声明
insert into el_temporal_try
(id, columnA,valid_period_start, valid_period_end)
values
(1,'B',sysdate - 8, sysdate - 7);
结果
ORA-00001: unique constraint (PBSVW.EL_TEMPORAL_TRY_PK) violated
我理解是因为 "ID" 列。但是,我的问题是这两行是不同时期的,应该允许吗?
我打算使用这个句点作为功能来捕获记录的更改历史记录作为闪回的替代方法。但是,这是否意味着我不应该在这种情况下使用主键?
提前致谢!
问题和你说的id列有关。不可能添加注册表,因为主键是唯一的,然后您的第二个插入语句引用与第一个相同的 ID。您总是需要更改 ID 插入一行。
在 Oracle 12c 上,您可以像这样使用身份 link。
https://www.oracletutorial.com/oracle-basics/oracle-identity-column/
在另一个版本中,您可以使用序列和触发器来执行此操作。
https://chartio.com/resources/tutorials/how-to-define-an-auto-increment-primary-key-in-oracle/
感谢大家对此的帮助。这很可能意味着我无法使用主 Key/Foreign 密钥在特定时间戳内针对我的情况维护父子之间的参照完整性,但我必须采取其他措施。
非常感谢!
我有一个关于带句点的 Oracle Table 主键的问题。
我创建了两个 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
);
此脚本成功通过。但是我在插入数据时遇到问题:
我已经在父 table 中执行了以下两个插入语句:
第一个:语句
insert into el_temporal_try
(id, columnA,valid_period_start, valid_period_end)
values
(1,'A',sysdate - 10, sysdate - 9);
结果:
1 row inserted.
第二条:声明
insert into el_temporal_try
(id, columnA,valid_period_start, valid_period_end)
values
(1,'B',sysdate - 8, sysdate - 7);
结果
ORA-00001: unique constraint (PBSVW.EL_TEMPORAL_TRY_PK) violated
我理解是因为 "ID" 列。但是,我的问题是这两行是不同时期的,应该允许吗?
我打算使用这个句点作为功能来捕获记录的更改历史记录作为闪回的替代方法。但是,这是否意味着我不应该在这种情况下使用主键?
提前致谢!
问题和你说的id列有关。不可能添加注册表,因为主键是唯一的,然后您的第二个插入语句引用与第一个相同的 ID。您总是需要更改 ID 插入一行。
在 Oracle 12c 上,您可以像这样使用身份 link。 https://www.oracletutorial.com/oracle-basics/oracle-identity-column/
在另一个版本中,您可以使用序列和触发器来执行此操作。 https://chartio.com/resources/tutorials/how-to-define-an-auto-increment-primary-key-in-oracle/
感谢大家对此的帮助。这很可能意味着我无法使用主 Key/Foreign 密钥在特定时间戳内针对我的情况维护父子之间的参照完整性,但我必须采取其他措施。
非常感谢!