Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Deklaratywne podejście do ograniczania zakresów danych w tabeli

W oczekiwaniu na następną wersję Oracle 12c, która obsługuje Temporal Ważność , nadal stosuję następne podejście:

create table item ( title varchar2(32) primary key );
create table price ( 
   price_id          number primary key,
   item              varchar2(32) not null references item (title), 
   price             number(9,2), 
   effective_from    date not null, 
   effective_to      date not null, 
   effective_prev_to date,
   constraint price_from_to_ck check ( effective_to > effective_from ),
   constraint price_to_prev_ck check ( effective_from = effective_prev_to + 1 ),
   constraint price_from_uq unique ( item, effective_to ),
   constraint price_dates_chain_fk foreign key ( item, effective_prev_to ) references price ( item, effective_to ) );

insert into item values ('LETTUCE');
insert into item values ('WHISKY');

insert into price values ( 1, 'LETTUCE', 1.05, date '2013-01-01', date '2013-03-31', null );
insert into price values ( 2, 'LETTUCE', 1.08, date '2013-04-01', date '2013-06-30', date '2013-03-31' ); 
insert into price values ( 3, 'WHISKY', 33.99, date '2013-01-01', date '2013-05-31', null );
insert into price values ( 4, 'WHISKY', 31.15, date '2013-06-01', date '2013-07-31', date '2013-05-31' ); 

Spróbujmy spróbować :

insert into price values ( 5, 'WHISKY', 30.55, date '2013-05-15', date '2013-06-05', date '2013-05-14' ); 

ORA-02291: integrity constraint (USER_4_E7DF1.PRICE_DATES_CHAIN_FK) violated - parent key not found : insert into price values ( 'WHISKY', 30.55, date '2013-05-15', date '2013-06-05', date '2013-05-14' )

Ale teraz aktualizowanie i usuwanie dat w środku łańcucha jest upierdliwe. Musi zmienić poprzednie i następne wiersze w jednej instrukcji za pomocą MERGE . Dlatego dodałem price_id kolumna, ponieważ nie możesz zaktualizować klucza w MERGE -- więc potrzebujesz innego klucza zamiast (element, efektywny_%).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Akcja dynamiczna odświeża wszystkie raporty na stronie

  2. Tworzenie wyzwalaczy

  3. Problem polegający na tym, że zmienne wiążące Oracle nie używają poprawnie indeksu

  4. SYS_EXTRACT_UTC() Funkcja w Oracle

  5. Zadzwoń do serwisu internetowego BI Publisher z ReportRawData