sql >> Database >  >> RDS >> Oracle

Declaratieve benadering om gegevensbereiken in tabel te beperken

In afwachting van de volgende Oracle 12c-versie, die Temporal ondersteunt Geldigheid , ik gebruik nog steeds de volgende aanpak:

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

Laten we proberen :

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

Maar nu is het bijwerken en verwijderen van datums in het midden van de keten pijn in de kont. Het moet de voorgaande en volgende rijen in één instructie wijzigen met MERGE . Daarom heb ik price_id . toegevoegd kolom, omdat u een sleutel niet kunt bijwerken in MERGE -- dus je hebt een andere sleutel nodig in plaats van (item, effectieve_%).



  1. Is de tabelvolgorde van belang in mysql?

  2. Een rij invoegen en raceconditie vermijden (PHP/MySQL)

  3. hoe te ontsnappen aan speciale tekens in mysql jdbc-verbindingsreeks

  4. Wat zijn SQL-operators en hoe werken ze?