В своем комментарии к ответу mathguy вы говорите: «Я также пытаюсь сделать так, чтобы период времени новых записей не пересекался с существующими». Я сделал это с материализованными представлениями «refre sh fast on commit». Предупреждение: «быстрое» обновление может быть медленным, если вы не будете осторожны, обратитесь к этому блогу http://www.adellera.it/, особенно в отношении статистики в журнале материализованного представления.
Я предполагаю эксклюзивные даты окончания. Если дата окончания равна нулю, это означает, что диапазон даты и времени продолжается бесконечно. Многие совпадения будут немедленно обнаружены первичным ключом и уникальными ограничениями. Другие будут пойманы во время фиксации ограничением материализованного представления. Обратите внимание, что в конце транзакции у MV никогда не будет строк.
SQL> create table date_ranges (
2 key1, start_date,
3 primary key(key1, start_date),
4 end_date,
5 unique(key1, end_date),
6 check(start_date < end_date)
7 )
8 as
9 with a as (select date '2000-01-01' dte from dual)
10 select 1, dte, dte+1 from a
11 union all
12 select 1, dte+1, dte+2 from a
13 union all
14 select 1, dte-1, dte from a
15 union all
16 select 2, dte+10, dte+11 from a
17 union all
18 select 2, dte+12, dte+13 from a
19 union all
20 select 2, dte+8, dte+9 from a
21 /
Table DATE_RANGES created.
SQL> create materialized view log on date_ranges
2 with sequence, rowid, primary key, commit scn (end_date) including new values
3 /
Materialized view log DATE_RANGES created.
SQL> create materialized view overlapping_ranges refresh fast on commit
2 as
3 select a.rowid arid, b.rowid brid
4 from date_ranges a, date_ranges b
5 where a.key1 = b.key1
6 and a.rowid != b.rowid
7 and a.start_date < b.end_date
8 and a.end_date > b.start_date;
Materialized view OVERLAPPING_RANGES created.
SQL>
SQL> alter materialized view overlapping_ranges
2 add constraint overlaps_not_allowed check (1=0) deferrable initially deferred
3 /
Materialized view OVERLAPPING_RANGES altered.
SQL> insert into date_ranges select 1, date '1999-12-30', date '2000-01-4' from dual;
1 row inserted.
SQL> commit;
Error starting at line : 42 in command -
commit
Error report -
ORA-02091: transaction rolled back
ORA-02290: check constraint (STEW.OVERLAPS_NOT_ALLOWED) violated