在Oracle SQL中检查约束条件

问题描述:

我有下表Goods_In_Wagon(Goods_ID,Wagon_ID,Total_Weight)。 我需要创建一些if语句检查约束,它说在Oracle SQL中检查约束条件

“如果WAGON_ID介于90和99之间,那么Total_Weight必须大于10”。 “ AND ”如果WAGON_ID在100和110之间,那么Total_Weight必须大于20.“ “ AND ”如果WAGON_ID在111和120之间,那么Total_Weight必须大于30.“

在SQL甲骨文这是可能的,如果是我怎么能实现它

使用超出线的约束:

CREATE TABLE Goods_In_Wagon (
    Goods_ID NUMBER(whatever), 
    Wagon_ID NUMBER(whatever), 
    Total_Weight NUMBER(whatever), 
    CONSTRAINT Check_WagID_Weight 
    CHECK (Wagon_ID NOT BETWEEN 90 AND 99 OR Total_Weight > 10) 
) 

如果Wagon_ID90和99之间不 ,约束通过。如果它在90到99之间,那么Total_Weight必须大于10.

这样的一个外部约束允许您在行级应用约束逻辑,这意味着它可以使用任何列值。


附录下面是如何处理与Wagon_IDTotal_Weight范围内更新的问题。可能有其他的方法,但这种感觉就像“最干净”,这意味着它是最简单的对我个人阅读:)

CREATE TABLE Goods_In_Wagon(
    Goods_ID NUMBER(whatever), 
    Wagon_ID NUMBER(whatever), 
    Total_Weight NUMBER(whatever), 
    CONSTRAINT Check_WagID_Weight 
    CHECK (
     (Wagon_ID < 90) OR 
     (Wagon_ID BETWEEN 90 AND 99 AND Total_Weight > 10) OR 
     (Wagon_ID BETWEEN 100 AND 110 AND Total_Weight > 20) OR 
     (Wagon_ID BETWEEN 111 AND 120 AND Total_Weight > 30) OR 
     (Wagon_ID > 120) 
    ) 
) 
+1

+1。但我认为应该修改约束来处理'NULL',例如'... OR NVL(Total_Weight,0)> 10)' – a1ex07 2013-05-06 14:40:50

+0

抱歉,我刚刚更新了 – Almanzt 2013-05-06 14:41:24

+0

@ a1ex07这个问题 - 很好的调用。 user2154840 - 你有处理空值的特殊要求吗?如果这样做会改变一些事情。至于你的编辑:没问题。 Oracle可以处理这个问题。我会尽快发布更新。 – 2013-05-06 14:43:21

修订,以反映附加要求

CREATE TABLE Goods_In_Wagon 
(
    Goods_ID 
    ,Wagon_ID 
    ,Total_Weight 
    CONSTRAINT check_Weight 
    CHECK ( 
     WAGON_ID < 90 
     OR 
     (TOTAL_WEIGHT > 10 AND WAGON_ID >= 90 AND WAGON_ID <= 99) 
     OR 
     (TOTAL_WEIGHT > 20 AND WAGON_ID >= 100 AND WAGON_ID <= 110) 
     OR 
     (TOTAL_WEIGHT > 30 AND WAGON_ID >= 111 AND WAGON_ID <= 120) 
     OR 
     WAGON_ID > 120 
    ) 
) 
+0

我刚刚更新了问题 – Almanzt 2013-05-06 14:42:45

+0

好的,现在上面的约束检查每个条件在一条单独的线上。 – 2013-05-06 14:49:48

+0

谢谢@declan_K – Almanzt 2013-05-06 15:17:55