เมื่อคุณลบสำเนาที่ซ้ำกันของคุณ:
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
แต่ถ้าคุณไม่บอกผู้ใช้ว่าไม่ได้ทำการแทรกพวกเขาจะสงสัยว่าทำไมข้อมูลถึงไม่มีและไม่มีการรายงานข้อยกเว้น
แก้ไขที่นี่เป็นตัวอย่างที่ทำสิ่งที่คุณขออย่างแน่นอนแม้ใช้ชื่อเดียวกับคำถามของคุณและพิสูจน์มัน คุณควรลองก่อนที่จะคิดความคิดดังกล่าวข้างต้นเพียงถือว่าหนึ่งคอลัมน์หรืออื่น ๆ เมื่อเทียบกับชุดค่าผสม ...
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 การละเมิดข้อ จำกัด คีย์ UNIQUE 'uq_Person' ไม่สามารถแทรกคีย์ซ้ำในวัตถุ 'dbo.Person' คำสั่งถูกยกเลิก