두 열의 조합에 고유 제한 조건 추가
나는 테이블을 가지고 있고, 같은 사람이 내 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
응용 프로그램을 변경하지 않고 응용 프로그램에 예외가 발생하지 않도록하려면 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에서 수행 할 수도 있습니다.
- "개인"테이블에서 색인을 마우스 오른쪽 단추로 클릭하십시오.
- 새 색인 클릭 / 호버
- 비 클러스터형 인덱스 ...를 클릭하십시오 .
- 기본 색인 이름 이 제공되지만 변경할 수도 있습니다.
- Check Unique checkbox
- Click Add... button
- Check the columns you want included
- Click OK in each window.
참고URL : https://stackoverflow.com/questions/15800250/add-unique-constraint-to-combination-of-two-columns
'Programing' 카테고리의 다른 글
Java & = 연산자가 & 또는 &&를 적용합니까? (0) | 2020.07.01 |
---|---|
언제 ugettext_lazy를 사용해야합니까? (0) | 2020.07.01 |
새로운 코드없이 C ++에서 생성자 호출 (0) | 2020.07.01 |
Windows 스레딩 : _beginthread vs _beginthreadex vs CreateThread C ++ (0) | 2020.07.01 |
C # 엔터티 프레임 워크 : .Find와 .Include를 모델 개체에 결합하려면 어떻게해야합니까? (0) | 2020.07.01 |