当前位置: 首页 > 知识库问答 >
问题:

具有时间有效性的Oracle表的主键冲突

司马羽
2023-03-14

你能给我一些关于表的主键操作在Oracle中具有时间有效性的一些看法吗?

我创建了一个具有以下架构的表

Create table TemporalTable_1 (
    Customer_ID number(8),
    Customer_name varchar2(100),
    valid_period_start timestamp, 
    valid_period_end timestamp, 
    period for valid_period(valid_period_start, valid_period_end),
    constraint TemporalTable_1_PK primary key (Customer_ID , VALID_PERIOD)
)
 
Customer_ID       | Customer_name        | Valid_period_start      | Valid_Period_end
------------------+----------------------+-------------------------+-----------------------
00001             | John Chan            | 01 JUN 2020 00:00:00    | 09 JUN 2020 23:59:59
00001             | Johnny Chan          | 10 JUN 2020 00:00:00    | Null
insert into TemporalTable_1 select * from OtherTable;

是因为Oracle实际上并不关心主键上的有效期列吗?

提前道谢!

共有1个答案

施俊驰
2023-03-14

Period name(VALID_PERIOD在您的例子中是)列只包含您的Period的ID。检查此脚本及其输出:

--drop table TemporalTable purge;
-- formatting for sqlplus:
col periodname for a20;
col constraint_name for a20;
col search_condition_vc for a80;
col valid_period_start for a16;
col valid_period_end   for a16;
col PERIODSTART for a20;
col PERIODEND   for a20;
alter session set nls_timestamp_format='yyyy-mm-dd hh24:mi';
-- end of formatting

Create table TemporalTable (
    Customer_ID number(8),
    Customer_name varchar2(10)
);

alter table TemporalTable add (
    valid_period_start timestamp, 
    valid_period_end   timestamp,
    period for valid_period(valid_period_start, valid_period_end)
);

ALTER TABLE TemporalTable ADD (
    vt_start DATE,
    vt_end DATE,
    PERIOD FOR vt (vt_start, vt_end)
);
-- inserting overlapping records:
insert into TemporalTable
select 1, 'A' , date'2020-01-01', date'2020-01-10', date'2020-01-01', date'2020-01-10' from dual union all
select 1, 'B' , date'2020-01-05', date'2020-01-08', date'2020-01-01', date'2020-01-10' from dual
/
commit;
-- check valid_period and vt hidden columns:
select tt.*,valid_period,vt from TemporalTable tt
/
select * 
from TemporalTable 
       AS OF PERIOD FOR valid_period DATE '2020-01-06'
/
select 
 constraint_name,
 constraint_type,
 search_condition_vc
from user_constraints c 
where table_name='TEMPORALTABLE';

select * from sys.SYS_FBA_PERIOD 
where obj#=(select object_id from user_objects where object_name='TEMPORALTABLE');
 类似资料:
  • 我创建了两个表,如下所示: 这个剧本成功地完成了。但是,我在插入数据时遇到问题: 我在父表中执行了以下两个insert语句: 我打算使用这个period for特性来捕获记录的更改历史,作为闪回的替代方法。但是,这是否意味着在这种情况下我不应该使用主键? 提前道谢!

  • 问题内容: 我正在尝试使用JPA / Hibernate设置以下表: 可能有很多用户,每个用户最多只能有一个验证码,也可能没有。 这是我的课程: 我创建一个用户,然后尝试使用以下代码添加验证代码: 当我尝试运行它时,我收到org.hibernate.PersistentObjectException:分离的实体传递给持久化:用户 我还尝试在Validation类中使用以下代码: 当我创建验证码时,

  • 我在Postgres中有两个表<code>foo 当我尝试使用此命令将数据从 复制到 时: 我得到一个错误: 错误:重复的键值违反了唯一约束“bar_pkey” 详细信息:键(id)=(1)已存在。 当表

  • 问题内容: 我需要一个表来存储一些评分,在此表中,我有一个 综合索引(user_id,post_id) 和其他列来标识不同的评分系统。 在此表中,我没有 主键, 因为 主键 必须是唯一的,而INDEX不必是唯一的,就我而言,唯一性是一个问题。 例如我可以有 缺少PRIMARY KEY可能会导致性能问题?我的表结构好还是需要更改? 谢谢 问题答案: 几点: 听起来您只是在使用表的当前唯一特性,并将其

  • 问题内容: 我有一个仅包含2个字段的表。该表具有由这两个字段形成的复合PK。 使用Netbeans从数据库创建实体bean时,不会像其他具有两个以上字段的表那样自动创建实体bean。 所以我想我需要自己创建实体bean。创建此实体bean的最佳实践是什么?是否必须包含对象? 问题答案: 我不使用NetBeans,因此我不能说任何有关其映射工具的信息。 要映射组合键,有两个选项。您可以 用PK字段定

  • 问题 如果我像下面的例子一样使用属性访问类型,我是否也必须为引用的FK定义getter和setter? 我不认为是这样,但Java EE6的官方文档是这样做的。 null