खोज…


विदेशी कुंजी संबंध / बाधा

विदेशी चाबियाँ आपको दो तालिकाओं के बीच संबंध को परिभाषित करने में सक्षम बनाती हैं। एक (मूल) तालिका में प्राथमिक कुंजी होनी चाहिए जो तालिका में विशिष्ट रूप से पंक्तियों की पहचान करती है। अन्य (बच्चे) तालिका में कॉलम में से किसी एक में प्राथमिक कुंजी का मान हो सकता है। भविष्य के प्रमुख संदर्भ बाधा यह सुनिश्चित करती है कि मूल तालिका में प्राथमिक कुंजी मान के रूप में बाल तालिका में मान मौजूद होना चाहिए।

इस उदाहरण में, हमारे पास CompanyId प्राथमिक कुंजी के साथ मूल कंपनी तालिका है, और बाल कर्मचारी तालिका जिसमें उस कंपनी की आईडी है जहां यह कर्मचारी काम करता है।

create table Company (
   CompanyId int primary key,
   Name nvarchar(200)
)
create table Employee (
    EmployeeId int,
    Name nvarchar(200),
    CompanyId int
        foreign key references Company(companyId)
)

विदेशी प्रमुख संदर्भ यह सुनिश्चित करते हैं कि Employee.CompanyId कॉलम में डाले गए मान Company.CompanyId कॉलम में भी मौजूद होने चाहिए। इसके अलावा, कंपनी की तालिका में कोई भी कंपनी को हटा नहीं सकता है यदि बच्चे की तालिका में मिलान करने वाली कंपनी के साथ कम से कम एक कर्मचारी है।

पूर्व प्रमुख संबंध यह सुनिश्चित करता है कि दो तालिकाओं में पंक्तियों को "अनलिंक" नहीं किया जा सकता है।

माता-पिता / बाल पंक्तियों के बीच संबंध बनाए रखना

मान लेते हैं कि हम CompanyId के साथ कंपनी तालिका में एक पंक्ति है। हम कर्मचारी तालिका में पंक्ति सम्मिलित कर सकते हैं जिसमें CompanyId 1 है:

insert into Employee values (17, 'John', 1)

हालाँकि, हम गैर-मौजूदा CompanyId वाले कर्मचारी को सम्मिलित नहीं कर सकते हैं:

insert into Employee values (17, 'John', 111111)

Msg 547, लेवल 16, स्टेट 0, लाइन 12 INSERT स्टेटमेंट फॉर्म्ड कुंजी बाधा "FK__Employee__Compan__1EE485AA" के साथ विवादित है। डेटाबेस "MyDb", तालिका "dbo.Company", कॉलम 'CompanyId' में संघर्ष हुआ। बयान समाप्त कर दिया गया है।

इसके अलावा, हम कंपनी तालिका में मूल पंक्ति को तब तक नहीं हटा सकते जब तक कि कर्मचारी तालिका में कम से कम एक बाल पंक्ति है जो इसे संदर्भित करती है।

delete from company where CompanyId = 1

Msg 547, लेवल 16, स्टेट 0, लाइन 14 DELETE स्टेटमेंट "REKERENCE अड़चन" FK__Employee__Compan__1EE485AA "के साथ विवादित है। डेटाबेस "MyDb", तालिका "dbo.Employee", कॉलम 'CompanyId' में संघर्ष हुआ। बयान समाप्त कर दिया गया है।

विदेशी कुंजी संबंध यह सुनिश्चित करता है कि कंपनी और कर्मचारी पंक्तियों को "अनलिंक" नहीं किया जाएगा।

मौजूदा मेज पर विदेशी कुंजी संबंध जोड़ना

पूर्व प्रमुख बाधा मौजूदा तालिकाओं पर जोड़ी जा सकती है जो अभी भी रिश्ते में नहीं हैं। कल्पना करें कि हमारे पास कंपनी और कर्मचारी तालिकाएं हैं जहां कर्मचारी तालिका CompanyId कॉलम है लेकिन विदेशी कुंजी संबंध नहीं है। अन्य तालिका विवरण आपको मौजूदा स्तंभ पर विदेशी कुंजी बाधा जोड़ने में सक्षम करता है जो उस तालिका में कुछ अन्य तालिका और प्राथमिक कुंजी का संदर्भ देता है:

alter table Employee
    add  foreign key (CompanyId) references Company(CompanyId)

मौजूदा तालिका में विदेशी कुंजी जोड़ें

बाधा के साथ प्रमुख कुंजी स्तंभ मौजूदा तालिकाओं पर जोड़े जा सकते हैं जो अभी भी रिश्ते में नहीं हैं। कल्पना करें कि हमारे पास कंपनी और कर्मचारी तालिकाएँ हैं जहाँ कर्मचारी तालिका में CompanyId कॉलम नहीं है। अन्य टेबल स्टेटमेंट आपको विदेशी कुंजी बाधा के साथ नया कॉलम जोड़ने में सक्षम बनाता है जो उस तालिका में कुछ अन्य तालिका और प्राथमिक कुंजी का संदर्भ देता है:

alter table Employee
    add CompanyId int foreign key references Company(CompanyId)

विदेशी प्रमुख बाधाओं के बारे में जानकारी प्राप्त करना

sys.foreignkeys सिस्टम दृश्य डेटाबेस में सभी विदेशी प्रमुख संबंधों के बारे में जानकारी देता है:

select name,
 OBJECT_NAME(referenced_object_id) as [parent table],
 OBJECT_NAME(parent_object_id) as [child table],
 delete_referential_action_desc,
 update_referential_action_desc
from sys.foreign_keys


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow