Programing

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

lottogame 2020. 7. 1. 08:02
반응형

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


나는 테이블을 가지고 있고, 같은 사람이 내 Person테이블에 두 번 들어갔다 . 현재 기본 키는 자동 번호 일 뿐이지 만 고유하게 강요하려는 두 개의 다른 필드가 있습니다.

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

ID  
Name  
Active  
PersonNumber  

고유 한 PersonNumber와 Active = 1을 갖는 1 개의 레코드 만 원합니다.
따라서 두 필드의 조합은 고유해야합니다.

SQL Server의 기존 테이블에서 가장 좋은 방법은 다른 사람이 기존 값과 동일한 값으로 삽입을 수행하면 실패하므로 응용 프로그램 코드에서이를 걱정할 필요가 없습니다.


중복을 제거하면 :

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/

응용 프로그램을 변경하지 않고 응용 프로그램에 예외가 발생하지 않도록하려면 INSTEAD 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

마지막 삽입시 오류 메시지 :

메시지 2627, 수준 14, 상태 1, 줄 3 고유 키 제약 조건 'uq_Person'위반 개체 'dbo.Person'에 중복 키를 삽입 할 수 없습니다. 그 진술서는 만료되었습니다.


GUI에서 수행 할 수도 있습니다.

  1. "개인"테이블에서 색인을 마우스 오른쪽 단추로 클릭하십시오.
  2. 새 색인 클릭 / 호버
  3. 비 클러스터형 인덱스 ...를 클릭하십시오 .

enter image description here

  1. 기본 색인 이름 이 제공되지만 변경할 수도 있습니다.
  2. Check Unique checkbox
  3. Click Add... button

enter image description here

  1. Check the columns you want included

enter image description here

  1. Click OK in each window.

참고URL : https://stackoverflow.com/questions/15800250/add-unique-constraint-to-combination-of-two-columns

반응형