2012-04-05 147 views
0

我一直在努力想出一種插入檢查的方式,以便它不會允許付款日期早於發票日期。基本上,我有兩張表:發票和付款。所以我想要一個支票約束來在發票表中的購買日期之前輸入付款日期。發票表中的invoice_id是付款表中的FK。任何幫助?在Oracle中檢查約束條件

+1

您可以使用相同的觸發器。 – 2012-04-05 05:12:44

+0

使用之前插入和檢查日期選擇並相互比較,所以你可以作出插入決定 – 2012-04-05 07:24:44

回答

3

檢查約束只能查看它在其上定義的表上的列。

您需要使用TRIGGER來執行此操作。

2

一種方法可能是在付款表中複製購買日期,在invoice_id +購買日期的組合上添加第二個唯一約束,然後修改FK約束以包含它。然後,你可以有你的行級約束。例如

CREATE TABLE invoices 
(invoice_id NUMBER NOT NULL 
, purchase_date DATE NOT NULL 
, CONSTRAINT invoice_pk PRIMARY KEY (invoice_id) 
, CONSTRAINT invoice_uk UNIQUE (invoice_id, purchase_date) 
); 

CREATE TABLE payments 
(payment_id NUMBER NOT NULL 
, invoice_id NUMBER NOT NULL 
, purchase_date DATE NOT NULL 
, payment_date DATE NOT NULL 
, CONSTRAINT payment_pk PRIMARY KEY (payment_id) 
, CONSTRAINT payment_invoice_fk 
    FOREIGN KEY (invoice_id, purchase_date) 
    REFERENCES invoices (invoice_id, purchase_date) 
, CONSTRAINT payment_date_ck 
    CHECK (payment_date >= purchase_date) 
); 

缺點:更新invoices.purchase_date變得有點棘手。