sql unique constraint on a 2 columns combination

前端 未结 3 670
梦毁少年i
梦毁少年i 2020-12-03 23:41

How can you create a unique constraint on a combination of two values in two columns.

meaning

column1  column2 
   2        1 

lo

相关标签:
3条回答
  • 2020-12-04 00:20

    If your database allows expressions in an index you can do something like this (ANSI SQL):

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

    Note this is a unique index not a unique constraint. The only difference for most DBMS is that you can't have a unique index as the target of a foreign key, but otherwise they serve the same purpose.

    If your DBMS does not have least() or greatest() you can replace that using a CASE expression:

    create unique index on your_table 
      (case column1 < column2 then column1 else column2 end, 
       case column2 > column1 then column2 else column1 end));
    
    0 讨论(0)
  • 2020-12-04 00:27

    A unique constraint on 2 columns only prevents those exact 2 values being inserted (switching them is allowed):

    So you need A TRIGGER like this (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;
    

    Warning: syntax not checked.

    0 讨论(0)
  • 2020-12-04 00:30

    Looking at the documentation, found this for the 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);
    

    Chapter "Specifying the Index Associated with a Constraint" on the page ORACLE documentation.

    Hop this help.

    0 讨论(0)
提交回复
热议问题