복붙노트

[SQL] 두 열의 조합에 고유 제한 조건을 추가

SQL

두 열의 조합에 고유 제한 조건을 추가

어떻게 든, 같은 사람이 두 번 내 사람이 테이블에있어, 테이블이 있고. 지금, 기본 키는 일련 번호입니다하지만 고유 강제하려는 존재하는 두 개의 다른 분야가있다.

예를 들어, 필드는 다음과 같습니다

ID  
Name  
Active  
PersonNumber  

나는 단지 한 독특한 PersonNumber와 기록 및 Active = 1를 원한다. (그래서 두 필드의 조합은 고유해야)

SQL 서버의 기존 테이블에 가장 좋은 방법은 내가 다른 사람이 기존 값과 같은 값을 삽입 않는 경우 내 응용 프로그램 코드에서이 걱정하지 않아도 그렇게, 실패 할 수 있습니다.

해결법

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

    1.당신은 당신의 중복 (들)을 제거한 후에 :

    당신은 당신의 중복 (들)을 제거한 후에 :

    ALTER TABLE dbo.yourtablename
      ADD CONSTRAINT uq_yourtablename UNIQUE(column1, column2);
    

    또는

    CREATE UNIQUE INDEX uq_yourtablename
      ON dbo.yourtablename(column1, column2);
    

    물론, 종종 전에 단지 SQL Server는 행을 삽입하려고시키는 예외 (예외가 비싸다) 반환, 먼저 위반을 확인하는 것이 좋습니다 수 있습니다.

    http://www.sqlperformance.com/2012/08/t-sql-queries/error-handling

    http://www.mssqltips.com/sqlservertip/2632/checking-for-potential-constraint-violations-before-entering-sql-server-try-and-catch-logic/

    응용 프로그램을 변경하지 않고, 응용 프로그램까지 버블 링에서 예외를 방지하려면, 대신 OF 트리거를 사용할 수 있습니다 :

    CREATE TRIGGER dbo.BlockDuplicatesYourTable
     ON dbo.YourTable
     INSTEAD OF INSERT
    AS
    BEGIN
      SET NOCOUNT ON;
    
      IF NOT EXISTS (SELECT 1 FROM inserted AS i 
        INNER JOIN dbo.YourTable AS t
        ON i.column1 = t.column1
        AND i.column2 = t.column2
      )
      BEGIN
        INSERT dbo.YourTable(column1, column2, ...)
          SELECT column1, column2, ... FROM inserted;
      END
      ELSE
      BEGIN
        PRINT 'Did nothing.';
      END
    END
    GO
    

    당신은 사용자가 삽입을 수행하지 않은 말하지 않는 경우에, 그들은 데이터가없는 이유를 궁금해 갈거야, 예외는보고되지 않았다.

    편집 여기에 당신도 당신의 질문과 동일한 이름을 사용을 요구하고 정확하게 수행하고이를 증명하는 예입니다. 당신은 위의 아이디어를 만 치료 한 열 또는 조합에 반대하는 등 다른 가정 전에 그것을 시도해야 ...

    USE tempdb;
    GO
    
    CREATE TABLE dbo.Person
    (
      ID INT IDENTITY(1,1) PRIMARY KEY,
      Name NVARCHAR(32),
      Active BIT,
      PersonNumber INT
    );
    GO
    
    ALTER TABLE dbo.Person 
      ADD CONSTRAINT uq_Person UNIQUE(PersonNumber, Active);
    GO
    
    -- succeeds:
    INSERT dbo.Person(Name, Active, PersonNumber)
      VALUES(N'foo', 1, 22);
    GO
    
    -- succeeds:
    INSERT dbo.Person(Name, Active, PersonNumber)
      VALUES(N'foo', 0, 22);
    GO
    
    -- fails:
    INSERT dbo.Person(Name, Active, PersonNumber)
      VALUES(N'foo', 1, 22);
    GO
    

    이 모든 후 테이블의 데이터 :

    ID   Name   Active PersonNumber
    ---- ------ ------ ------------
    1    foo    1      22
    2    foo    0      22
    

    지난 삽입에 오류 메시지 :

  2. ==============================

    2.이 또한 GUI에서 수행 할 수 있습니다 :

    이 또한 GUI에서 수행 할 수 있습니다 :

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

    3.당신은 쿼리 삽입을 많이 가지고 있지만 오류 메시지마다 시간을 얻을 싶다면, 당신은 그것을 할 수 있습니다 :

    당신은 쿼리 삽입을 많이 가지고 있지만 오류 메시지마다 시간을 얻을 싶다면, 당신은 그것을 할 수 있습니다 :

    CREATE UNIQUE NONCLUSTERED INDEX SK01 ON dbo.Person(ID,Name,Active,PersonNumber) 
    WITH(IGNORE_DUP_KEY = ON)
    

  4. from https://stackoverflow.com/questions/15800250/add-unique-constraint-to-combination-of-two-columns by cc-by-sa and MIT license