Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Pendekatan deklaratif untuk membatasi rentang data dalam tabel

Sambil menunggu versi Oracle 12c berikutnya, yang mendukung Temporal Validitas , saya masih menggunakan pendekatan berikutnya:

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' ); 

Mari coba :

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' )

Tapi sekarang memperbarui dan menghapus tanggal di tengah rantai adalah rasa sakit di pantat. Itu perlu mengubah baris sebelum dan sesudah dalam satu pernyataan dengan MERGE . Itu sebabnya saya menambahkan price_id kolom, karena Anda tidak dapat memperbarui kunci di MERGE -- jadi, Anda memerlukan kunci lain sebagai ganti (item, efektif_%).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ORA-00923:FROM kata kunci tidak ditemukan di tempat yang diharapkan - SQLDeveloper

  2. Kembalikan baris data dari blok pl/sql

  3. Oracle Pro*C/OCI menginstal handler untuk SIGSEGV/SIGABRT dan teman-teman - mengapa, dan bagaimana cara menonaktifkannya?

  4. Tanggal bulat hingga interval 10 menit

  5. Bagaimana saya bisa terhubung ke database Oracle berbasis web dengan Java?