sql >> データベース >  >> RDS >> Oracle

テーブル内のデータ範囲を制約するための宣言型アプローチ

    一時妥当性 、私はまだ次のアプローチを使用しています:

    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を使用して、1つのステートメントの前後の行を変更する必要があります。 。そのため、price_idを追加しました MERGEでキーを更新できないため -したがって、(item、effective _%)の代わりに別のキーが必要です。



    1. mysql>データベーステストの作成;エラー1006(HY000):データベース'test'を作成できません(errno:2)

    2. MicrosoftAccessクエリで計算フィールドを作成する方法

    3. 給与データモデル

    4. 高度な合計集計フィールド