Setelah Anda menghapus duplikat Anda:
ALTER TABLE dbo.yourtablename
ADD CONSTRAINT uq_yourtablename UNIQUE(column1, column2);
atau
CREATE UNIQUE INDEX uq_yourtablename
ON dbo.yourtablename(column1, column2);
Tentu saja, sering kali lebih baik untuk memeriksa pelanggaran ini terlebih dahulu, sebelum membiarkan SQL Server mencoba memasukkan baris dan mengembalikan pengecualian (pengecualian mahal).
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/
Jika Anda ingin mencegah pengecualian meluap ke aplikasi, tanpa membuat perubahan pada aplikasi, Anda dapat menggunakan INSTEAD OFpemicu:
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
Tetapi jika Anda tidak memberi tahu pengguna bahwa mereka tidak melakukan penyisipan, mereka akan bertanya-tanya mengapa data tidak ada dan tidak ada pengecualian yang dilaporkan.
EDIT di sini adalah contoh yang melakukan persis apa yang Anda minta, bahkan menggunakan nama yang sama dengan pertanyaan Anda, dan membuktikannya. Anda harus mencobanya sebelum mengasumsikan ide-ide di atas hanya memperlakukan satu kolom atau yang lain sebagai lawan kombinasi ...
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
Data dalam tabel setelah semua ini:
ID Name Active PersonNumber
---- ------ ------ ------------
1 foo 1 22
2 foo 0 22
Pesan kesalahan pada sisipan terakhir:
Msg 2627, Level 14, Negara Bagian 1, Baris 3 Pelanggaran batasan UNIQUE KEY 'uq_Person'. Tidak dapat memasukkan kunci duplikat di objek 'dbo.Person'. Pernyataan itu telah dihentikan.