복붙노트

[SQL] 2 열 조합에 SQL 고유 제한 조건

SQL

2 열 조합에 SQL 고유 제한 조건

당신은 두 개의 열 두 값의 조합에 고유 제한 조건을 만들 수있는 방법.

의미

column1  column2 
   2        1 

수 없도록 제약을 찾고

column1  column2 
   1        2 

해결법

  1. ==============================

    1.데이터베이스 인덱스의 표현을 허용하는 경우이 (ANSI SQL)과 같은 작업을 수행 할 수 있습니다 :

    데이터베이스 인덱스의 표현을 허용하는 경우이 (ANSI SQL)과 같은 작업을 수행 할 수 있습니다 :

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

    이 고유 인덱스가 아닌 고유 제한 조건 참고. 대부분의 DBMS에 대한 유일한 차이점은 외래 키의 대상으로 고유 인덱스를 가질 수 없다는 것입니다,하지만, 그렇지 않은 경우는 동일한 목적을 제공합니다.

    당신의 DBMS는 적어도 () 또는 최대가없는 경우 () 당신은 CASE 식을 사용하는 것을 대체 할 수있다 :

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

    2.문서에 보면, ORACLE SGBD이 발견 :

    문서에 보면, 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 문서의 "제약 조건과 인덱스 관련 지정"장.

    이 도움말 홉.

  3. ==============================

    3.2 열에서 고유 한 제약 만이 개 정확한 값 (그들 허용되는 스위칭) 삽입 방지 :

    2 열에서 고유 한 제약 만이 개 정확한 값 (그들 허용되는 스위칭) 삽입 방지 :

    이 (ORACLE)과 같은 트리거가 필요합니다 그래서 :

     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;
    

    경고 : 구문 확인하지.

  4. from https://stackoverflow.com/questions/10159411/sql-unique-constraint-on-a-2-columns-combination by cc-by-sa and MIT license