Создать первичный ключ для таблицы с периодом (Temporal Validity) в Oracle SQL

У меня вопрос относительно первичного ключа для таблицы 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
);

Этот сценарий прошел успешно. Однако у меня проблема со вставкой данных:

Я выполнил следующие два оператора вставки в родительскую таблицу:

1-е: заявление

insert into el_temporal_try 
(id, columnA,valid_period_start, valid_period_end)
values
(1,'A',sysdate - 10, sysdate - 9);

Результат:

Вставлена ​​1 строка.

2-й: заявление

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». Однако следует ли разрешить мои проблемы из-за того, что эти две строки относятся к разному периоду?

Я планировал использовать этот период для функции захвата истории изменений записи в качестве альтернативы ретроспективному кадру. Однако означает ли это, что я не должен использовать первичный ключ в этой ситуации?

Заранее спасибо!


person E Leung    schedule 11.03.2020    source источник


Ответы (2)


Проблема связана с столбцом 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/.

person Denilson Dudas    schedule 12.03.2020

Спасибо за помощь в этом. Скорее всего, это означает, что я не могу использовать первичный ключ / внешний ключ для поддержания ссылочной целостности между родителем и сыном для моей ситуации в пределах определенной временной метки, но мне нужно пойти на что-то другое.

Большое спасибо!

person E Leung    schedule 12.03.2020