Kopyalarınızı kaldırdıktan sonra:
ALTER TABLE dbo.yourtablename
ADD CONSTRAINT uq_yourtablename UNIQUE(column1, column2);
veya
CREATE UNIQUE INDEX uq_yourtablename
ON dbo.yourtablename(column1, column2);
Tabii ki, sadece SQL Server'ın satırı eklemeye ve bir istisna döndürmeye izin vermeden önce bu ihlali kontrol etmek genellikle daha iyi olabilir (istisnalar pahalıdır).
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/
İstisnaların uygulamada köpürmesini önlemek istiyorsanız, uygulamada değişiklik yapmadan bir INSTEAD OF
tetikleyici kullanabilirsiniz :
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
Ancak kullanıcıya eki gerçekleştirmediklerini söylemezseniz, verinin neden orada olmadığını ve herhangi bir istisna bildirilmediğini merak ederler.
Burada DÜZENLEME , tam olarak sorduğunuz şeyi yapan, sorunuzla aynı isimleri bile kullanan ve kanıtlayan bir örnektir. Yukarıdaki fikirlerin kombinasyonun aksine sadece bir sütunu veya diğerini tedavi ettiğini varsaymadan önce denemelisiniz ...
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
Tüm bunlardan sonra tablodaki veriler:
ID Name Active PersonNumber
---- ------ ------ ------------
1 foo 1 22
2 foo 0 22
Son eklemedeki hata mesajı:
Msg 2627, Seviye 14, Durum 1, Satır 3 BENZERSİZ ANAHTAR kısıtlaması 'uq_Person' ihlali. 'Dbo.Person' nesnesine yinelenen anahtar eklenemiyor. Açıklama sona erdirildi.