2012-04-15 148 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页的“指定索引关联使用约束”。

跳过这个帮助。