परिदृश्य:
आप SQL सर्वर डेवलपर के रूप में काम कर रहे हैं, आपने तालिका में से एक के लिए एक अपडेट स्टेटमेंट लिखा है और नीचे त्रुटि हो रही है।Msg 547, Level 16, State 0, Line 32
अद्यतन विवरण संदर्भ बाधा "FK_" के साथ विरोध करता है।
डेटाबेस "YourDatabaseName", तालिका "SchemaName.YourTableName", कॉलम 'ColumnName' में विरोध हुआ।
विवरण समाप्त कर दिया गया है।
इस समस्या को कैसे हल करें?<बीआर />
समाधान:
आइए पहले नीचे दी गई स्क्रिप्ट का उपयोग करके इस त्रुटि को बनाएं। हम दो टेबल dbo.Customer और dbo.Orders बनाने जा रहे हैं। तालिकाओं में प्राथमिक-विदेशी कुंजी संबंध होता है।अपने डेटाबेस नाम का उपयोग करें GOCREATE तालिका dbo.Customer ( Customerid INT PRIMARY KEY ,FName VARCHAR(100),LName VARCHAR(100), SSN VARCHAR(10) ) तालिका dbo.Orders बनाएं (OrderId INT Identity(1, 1),OrderitemName VARCHAR(50), OrderItemAmt INT, Customer_id INT विदेशी कुंजी संदर्भ ग्राहक (CustomerId)) --dbo.Customer (CustomerId,FName) में नमूना डेटा डालें। ,SSN) मान (1,'आमिर', 'शहजाद', '000-000-00') dbo में डालें।
रिकॉर्ड को कैसे अपडेट करें जब SQL सर्वर में विदेशी कुंजी बाधा द्वारा कॉलम को संदर्भित किया जाता है |
अब मान लें कि यदि आपको लगता है कि CustomerId मान dbo.Customer में गलत है और इसे अपडेट करने की आवश्यकता है। आपने CustomerId को 100 में अपडेट करने के लिए अपडेट स्टेटमेंट नीचे लिखा है।
dbo अपडेट करें। कस्टमर सेट Customerid=100
आपको नीचे त्रुटि मिलेगी।
संदेश 547, स्तर 16, राज्य 0, पंक्ति 33अद्यतन विवरण संदर्भ बाधा "FK__Orders__Customer__1ED998B2" के साथ विरोधाभासी है। डेटाबेस "YourDatabaseName", तालिका "dbo.Orders", कॉलम 'Customer_id' में विरोध हुआ। स्टेटमेंट को समाप्त कर दिया गया है।
चूंकि dbo.Orders टेबल में कोई Customer_id value=100 नहीं है, आप अपडेट नहीं कर सकते संदर्भ तालिका में रिकॉर्ड। अब आपने सोचा कि पहले पैरेंट टेबल को ठीक करते हैं ( dbo.Orders) और फिर मैं dbo.Customer टेबल को अपडेट कर सकता हूं।
अपडेट dbo.Orders set Customer_Id=100फिर से आपको त्रुटि मिली जैसा कि नीचे दिखाया गया है, क्योंकि हमारे पास dbo.Customer तालिका में CustomerId=100 उपलब्ध नहीं है। ". डेटाबेस "YourDatabaseName", टेबल "dbo.Customer", कॉलम 'Customerid' में विरोध हुआ। स्टेटमेंट को समाप्त कर दिया गया है।
यहां से हम कई समाधान लेकर आ सकते हैं 1) रिकॉर्ड को अपडेट करने के बजाय, रेफरेंस टेबल (Dbo.Customer) में रिकॉर्ड डालें, फिर पेरेंट टेबल (Dbo.Orders) में रिकॉर्ड को अपडेट करें और अंत में मौजूदा रिकॉर्ड्स को रेफरेंस टेबल से हटा दें।
--Insert संदर्भ तालिका में रिकॉर्ड पहले dbo.Customer (CustomerId, FName, LName,SSN) मानों (100, 'आमिर', 'शहजाद', '000-000-00') में डालें -- पैरेंट टेबल में रिकॉर्ड अपडेट करें dbo अपडेट करें। ऑर्डर सेट Customer_Id=100 -- संदर्भ तालिका से पुराना रिकॉर्ड हटाएं dbo.Customer से हटाएं जहां CustomerId=1तालिका में रिकॉर्ड अभी जांचें।
एसक्यूएल सर्वर में विदेशी कुंजी बाधा द्वारा संदर्भित होने पर कॉलम वैल्यू को कैसे अपडेट करें |
2) विदेशी कुंजी प्रतिबंध को अक्षम करें और मानों को मैन्युअल रूप से अपडेट करें एक अन्य समाधान हो सकता है, विदेशी कुंजी बाधा को अक्षम करें, रिकॉर्ड्स को अपडेट करें और अंत में फिर से विदेशी कुंजी को सक्षम करें। object_name(Parent_object_id) TableName के रूप में, नाम sys.foreign_keys से विदेशीकी कॉन्स्ट्रेनम नाम के रूप में
नीचे दिए गए कथन का उपयोग करके विदेशी कुंजी बाधा को अक्षम करें
सिंटैक्सALTER TABLE SchemaName.ParentTableNameNOCHECK CONSTRAINT Constraint_Name
मैंने dbo.Orders तालिका पर विदेशी कुंजी बाधा को अक्षम करने के लिए नीचे दिए गए कथन का उपयोग किया है।
--NOCHECKALTER TABLE dbo.OrdersNOCHECK CONSTRAINT FK__Orders__Customer__2A4B4B5E--Run Update Statements update dbo का उपयोग करके Foregin key को अक्षम करें। Customer set Customerid=100 update dbo.Orders set Customer_Id=100विदेशी कुंजी बाधा को सक्षम करें वैकल्पिक तालिका स्कीमानाम.ParentTableNameCHECK CONSTRAINT Constraint_Name
मैं dbo.Orders तालिका पर विदेशी कुंजी बाधा को सक्षम करने के लिए नीचे स्क्रिप्ट निष्पादित करता हूं। टेबल dbo.Orders चेक बाधा FK__Orders__Customer__2A4B4B5E
वीडियो डेमो :अद्यतन विवरण संदर्भ प्रतिबंध के विपरीत है