2012-04-05 107 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变得有点棘手。