अगले Oracle 12c संस्करण की प्रतीक्षा करते हुए, जो Temporal का समर्थन करता है वैधता , मैं अभी भी अगले दृष्टिकोण का उपयोग करता हूं:
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' );
आइए कोशिश करें :
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' )
लेकिन अब चैन के बीच में तारीखों को अपडेट और डिलीट करना कमर में दर्द है। इसे MERGE
. के साथ एक स्टेटमेंट में पूर्ववर्ती और निम्नलिखित पंक्तियों को बदलने की आवश्यकता है . इसलिए मैंने price_id
जोड़ा है कॉलम, क्योंकि आप MERGE
. में एक कुंजी अपडेट नहीं कर सकते -- इसलिए, आपको (आइटम, प्रभावी_%) के बजाय दूसरी कुंजी की आवश्यकता है।