एक बार जब आप अपने डुप्लीकेट हटा देते हैं:
ALTER TABLE dbo.yourtablename
ADD CONSTRAINT uq_yourtablename UNIQUE(column1, column2);
या
CREATE UNIQUE INDEX uq_yourtablename
ON dbo.yourtablename(column1, column2);
बेशक, पहले इस उल्लंघन की जांच करना अक्सर बेहतर हो सकता है, इससे पहले कि SQL सर्वर पंक्ति को सम्मिलित करने का प्रयास करे और एक अपवाद लौटाए (अपवाद महंगे हैं)।
-
विभिन्न त्रुटि प्रबंधन तकनीकों का प्रदर्शन प्रभाव
-
TRY/CATCH में प्रवेश करने से पहले संभावित बाधा उल्लंघनों की जांच करना
यदि आप एप्लिकेशन में बदलाव किए बिना अपवादों को एप्लिकेशन में आने से रोकना चाहते हैं, तो आप 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अद्वितीय कुंजी बाधा 'uq_Person' का उल्लंघन। ऑब्जेक्ट 'dbo.Person' में डुप्लीकेट कुंजी नहीं डाल सकते। स्टेटमेंट समाप्त कर दिया गया है।
इसके अलावा, मैंने हाल ही में दो कॉलम किसी भी क्रम में . के लिए एक अद्वितीय बाधा लागू करने के समाधान के बारे में ब्लॉग किया था :
- एक अद्वितीय प्रतिबंध लागू करें जहां आदेश मायने नहीं रखता