Після видалення дублікатів:
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
Але якщо ви не скажете користувачеві, що вони не виконували вставку, вони зададуться питанням, чому даних немає, і не було повідомлено про виключення.
Ось EDIT - це приклад, який робить саме те, що ви просите, навіть використовуючи ті самі назви, що і ваше запитання, і доводить це. Ви повинні спробувати це, перш ніж припускати, що вищезазначені ідеї стосуються лише одного стовпчика чи іншого, на відміну від комбінації ...
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'. Заява скасована.