[SQL] 두 열의 조합에 고유 제한 조건을 추가
SQL두 열의 조합에 고유 제한 조건을 추가
어떻게 든, 같은 사람이 두 번 내 사람이 테이블에있어, 테이블이 있고. 지금, 기본 키는 일련 번호입니다하지만 고유 강제하려는 존재하는 두 개의 다른 분야가있다.
예를 들어, 필드는 다음과 같습니다
ID
Name
Active
PersonNumber
나는 단지 한 독특한 PersonNumber와 기록 및 Active = 1를 원한다. (그래서 두 필드의 조합은 고유해야)
SQL 서버의 기존 테이블에 가장 좋은 방법은 내가 다른 사람이 기존 값과 같은 값을 삽입 않는 경우 내 응용 프로그램 코드에서이 걱정하지 않아도 그렇게, 실패 할 수 있습니다.
해결법
-
==============================
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.이 또한 GUI에서 수행 할 수 있습니다 :
이 또한 GUI에서 수행 할 수 있습니다 :
-
==============================
3.당신은 쿼리 삽입을 많이 가지고 있지만 오류 메시지마다 시간을 얻을 싶다면, 당신은 그것을 할 수 있습니다 :
당신은 쿼리 삽입을 많이 가지고 있지만 오류 메시지마다 시간을 얻을 싶다면, 당신은 그것을 할 수 있습니다 :
CREATE UNIQUE NONCLUSTERED INDEX SK01 ON dbo.Person(ID,Name,Active,PersonNumber) WITH(IGNORE_DUP_KEY = ON)
from https://stackoverflow.com/questions/15800250/add-unique-constraint-to-combination-of-two-columns by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 어떻게 SQL에 LINQ를 가진 IN 서브 쿼리를 처리 할 수 있습니까? (0) | 2020.04.09 |
---|---|
[SQL] 주석 @Id 및 @GeneratedValue (전략 = GenerationType.IDENTITY)의 사용은 무엇인가? 왜 generationtype 정체성은 무엇입니까? (0) | 2020.04.09 |
[SQL] 어떻게 여러 열에서 중복을 찾을 수 있습니까? (0) | 2020.04.09 |
[SQL] 어떻게 현재의 트랜잭션 (transaction) 레벨을 찾는 방법은? (0) | 2020.04.09 |
[SQL] 참조 별칭은 WHERE 절에서 (SELECT에서 계산) (0) | 2020.04.09 |