2012-04-15 215 views
3

如何爲兩列中的兩個值的組合創建唯一約束。2列組合的SQL唯一約束

意義

column1 column2 
    2  1 

尋找約束不允許

column1 column2 
    1  2 
+0

我想你可能想嘗試插入觸發器來處理這一個。 – 2012-04-15 04:13:54

+1

所以你想不允許column1小於column2?你能否更具體地說明你想要製造的約束? – aaaidan 2012-04-15 04:26:22

回答

5

如果你的數據庫允許在索引中,你可以做這樣的事情(ANSI SQL)表達式:

CREATE UNIQUE INDEX on your_table (least(column1, column2) 
           , greatest(column1, column2)); 

注意這是一個獨特的索引不是一個獨特的公司nstraint。大多數數據庫管理系統唯一的區別是你不能擁有唯一的索引作爲外鍵的目標,但是否則它們的目的是相同的。

如果你的DBMS沒有least()greatest()你可以替換使用CASE表達式:

create unique index on your_table 
    (case column1 < column2 then column1 else column2 end, 
    case column2 > column1 then column2 else column1 end)); 
0

對2列的唯一約束只能防止被插入(切換它們是允許的)那些確切的2個值:

因此,你需要這樣的(ORACLE),TRIGGER:

CREATE TRIGGER trig1 
     BEFORE INSERT ON TAB 
     REFERENCING NEW AS NEW 
     FOR EACH ROW 
    DECLARE 
     FOUND NUMBER; 
    BEGIN 
     SELECT COUNT(1) into FOUND FROM TAB WHERE 
     (COLUMN1=:NEW.column2 AND COLUMN2=:NEW.column1) 
     OR (COLUMN1=:NEW.column1 AND COLUMN2=:NEW.column2); 
    IF FOUND>0 THEN 
    raise_application_error (-20001,'INSERT not allowed'); 
    END IF; 
     END trig1; 

警告:語法未選中。

0

望着文檔,發現這個對於ORACLE SGBD:

CREATE TABLE b(
b1 INT, 
b2 INT, 
CONSTRAINT bu1 UNIQUE (b1, b2) 
       USING INDEX (create unique index bi on b(b1, b2)), 
CONSTRAINT bu2 UNIQUE (b2, b1) USING INDEX bi); 

ORACLE documentation頁的「指定索引關聯使用約束」。

跳過這個幫助。