Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

दो स्तंभों के संयोजन के लिए अद्वितीय बाधा जोड़ें

एक बार जब आप अपने डुप्लीकेट हटा देते हैं:

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' में डुप्लीकेट कुंजी नहीं डाल सकते। स्टेटमेंट समाप्त कर दिया गया है।

इसके अलावा, मैंने हाल ही में दो कॉलम किसी भी क्रम में . के लिए एक अद्वितीय बाधा लागू करने के समाधान के बारे में ब्लॉग किया था :

  • एक अद्वितीय प्रतिबंध लागू करें जहां आदेश मायने नहीं रखता


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. समाधान में सभी एसएसआईएस पैकेजों की सभी त्रुटियां कैसे प्राप्त करें

  2. Microsoft SQL सर्वर त्रुटि 18456 का समस्या निवारण

  3. SQL सर्वर समांतर डेटावेयरहाउसिंग टीडीएस त्रुटि के लिए कर्सर समर्थन के लिए एक वर्कअराउंड एक कार्यान्वित सुविधा नहीं है

  4. SQL सर्वर में LIMIT 10..20

  5. SQL सर्वर में विश्लेषण सेवाओं (SSAS) डेटाबेस के सारणीबद्ध मॉडल प्रसंस्करण को स्वचालित करना