2013-05-06 162 views
2

我有下表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甲骨文這是可能的,如果是我怎麼能實現它

回答

5

使用超出線的約束:

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

1

修訂,以反映附加要求

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