【问题标题】:Create primary key for table with period (Temporal Validity) in Oracle SQL在 Oracle SQL 中为带有句点(临时有效性)的表创建主键
【发布时间】:2020-03-11 23:06:08
【问题描述】:

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

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

提前致谢!

【问题讨论】:

    标签: sql oracle primary-key sql-insert temporal-tables


    【解决方案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/

    【讨论】:

      【解决方案2】:

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

      非常感谢!

      【讨论】:

        猜你喜欢
        • 2020-01-28
        • 2020-11-02
        • 1970-01-01
        • 1970-01-01
        • 2010-11-04
        • 2019-04-04
        • 2019-12-07
        • 1970-01-01
        • 2012-05-30
        相关资源
        最近更新 更多