यदि आप किसी व्यक्ति के नाम को प्राथमिक कुंजी के रूप में उपयोग कर रहे हैं और उनका नाम बदल गया है तो आपको प्राथमिक कुंजी को बदलने की आवश्यकता होगी। इसका ON UPDATE CASCADE
उपयोग तब से किया जाता है क्योंकि यह अनिवार्य रूप से उन सभी संबंधित तालिकाओं में परिवर्तन को रोक देता है जिनके प्राथमिक कुंजी के लिए विदेशी-कुंजी संबंध हैं।
उदाहरण के लिए:
USE tempdb;
GO
CREATE TABLE dbo.People
(
PersonKey VARCHAR(200) NOT NULL
CONSTRAINT PK_People
PRIMARY KEY CLUSTERED
, BirthDate DATE NULL
) ON [PRIMARY];
CREATE TABLE dbo.PeopleAKA
(
PersonAKAKey VARCHAR(200) NOT NULL
CONSTRAINT PK_PeopleAKA
PRIMARY KEY CLUSTERED
, PersonKey VARCHAR(200) NOT NULL
CONSTRAINT FK_PeopleAKA_People
FOREIGN KEY REFERENCES dbo.People(PersonKey)
ON UPDATE CASCADE
) ON [PRIMARY];
INSERT INTO dbo.People(PersonKey, BirthDate)
VALUES ('Joe Black', '1776-01-01');
INSERT INTO dbo.PeopleAKA(PersonAKAKey, PersonKey)
VALUES ('Death', 'Joe Black');
एक SELECT
दोनों तालिकाओं के खिलाफ:
SELECT *
FROM dbo.People p
INNER JOIN dbo.PeopleAKA pa ON p.PersonKey = pa.PersonKey;
यह दिखाता है:
यदि हम PersonKey
कॉलम अपडेट करते हैं , और SELECT
:
UPDATE dbo.People
SET PersonKey = 'Mr Joe Black'
WHERE PersonKey = 'Joe Black';
SELECT *
FROM dbo.People p
INNER JOIN dbo.PeopleAKA pa ON p.PersonKey = pa.PersonKey;
हम देखते हैं:
उपर्युक्त UPDATE
कथन की योजना को देखते हुए, हम स्पष्ट रूप से देखते हैं कि दोनों सारणियों को एक एकल अद्यतन वक्तव्य द्वारा विदेशी कुंजी के रूप में परिभाषित किया गया है ON UPDATE CASCADE
:
इसे और अधिक स्पष्टता में देखने के लिए ऊपर दी गई छवि पर क्लिक करें
अंत में, हम अपनी अस्थायी तालिकाओं की सफाई करेंगे:
DROP TABLE dbo.PeopleAKA;
DROP TABLE dbo.People;
सरोगेट कुंजियों का उपयोग करते हुए ऐसा करने का पसंदीदा 1 तरीका होगा:
USE tempdb;
GO
CREATE TABLE dbo.People
(
PersonID INT NOT NULL IDENTITY(1,1)
CONSTRAINT PK_People
PRIMARY KEY CLUSTERED
, PersonName VARCHAR(200) NOT NULL
, BirthDate DATE NULL
) ON [PRIMARY];
CREATE TABLE dbo.PeopleAKA
(
PersonAKAID INT NOT NULL IDENTITY(1,1)
CONSTRAINT PK_PeopleAKA
PRIMARY KEY CLUSTERED
, PersonAKAName VARCHAR(200) NOT NULL
, PersonID INT NOT NULL
CONSTRAINT FK_PeopleAKA_People
FOREIGN KEY REFERENCES dbo.People(PersonID)
ON UPDATE CASCADE
) ON [PRIMARY];
INSERT INTO dbo.People(PersonName, BirthDate)
VALUES ('Joe Black', '1776-01-01');
INSERT INTO dbo.PeopleAKA(PersonID, PersonAKAName)
VALUES (1, 'Death');
SELECT *
FROM dbo.People p
INNER JOIN dbo.PeopleAKA pa ON p.PersonID = pa.PersonID;
UPDATE dbo.People
SET PersonName = 'Mr Joe Black'
WHERE PersonID = 1;
पूर्णता के लिए, अपडेट स्टेटमेंट की योजना बहुत सरल है, और कुंजियों को सरोगेट करने के लिए एक फायदा दिखाता है, अर्थात् केवल एक पंक्ति को प्राकृतिक-कुंजी परिदृश्य में कुंजी वाले प्रत्येक पंक्ति के विपरीत अपडेट करने की आवश्यकता होती है:
SELECT *
FROM dbo.People p
INNER JOIN dbo.PeopleAKA pa ON p.PersonID = pa.PersonID;
DROP TABLE dbo.PeopleAKA;
DROP TABLE dbo.People;
SELECT
उपरोक्त दो कथनों से आउटपुट हैं:
अनिवार्य रूप से, परिणाम लगभग समान है। एक प्रमुख अंतर यह है कि व्यापक प्राकृतिक कुंजी को हर तालिका में दोहराया नहीं जाता है जहां विदेशी कुंजी होती है। मेरे उदाहरण में, मैं VARCHAR(200)
उस व्यक्ति का नाम रखने के लिए एक कॉलम का उपयोग कर रहा हूं , जो VARCHAR(200)
हर जगह का उपयोग करने की आवश्यकता है । यदि विदेशी कुंजी वाले बहुत सी पंक्तियाँ और बहुत सी सारणियाँ हैं, जो बहुत सारी व्यर्थ स्मृति को जोड़ देंगी। ध्यान दें, मैं डिस्क स्पेस के बारे में बात नहीं कर रहा हूं क्योंकि ज्यादातर लोग कहते हैं कि डिस्क स्पेस इतना सस्ता है जितना अनिवार्य रूप से मुफ्त है। स्मृति, हालांकि, महंगी है और पोषित होने की हकदार है। जब आप लगभग 15 वर्णों की औसत नाम लंबाई पर विचार करते हैं, तो कुंजी के लिए 4-बाइट पूर्णांक का उपयोग करने से बड़ी मात्रा में मेमोरी बच जाएगी।
स्पर्शरेखा के बारे में सवाल करने के लिए कैसे और क्यों कुंजी को बदल सकते हैं क्यों किराए की चाबियाँ पर प्राकृतिक कुंजी का चयन करने के है, जो एक रोचक और शायद अधिक महत्वपूर्ण सवाल यह है कि के बारे में सवाल यह है कि, विशेष रूप से जहां प्रदर्शन एक डिजाइन लक्ष्य है। उस बारे में मेरा प्रश्न यहाँ देखें ।
1 - http://weblogs.sqlteam.com/mladenp/archive/2009/10/06/Why-I-prefer-surrogate-keys-instead-of-natural-keys-in.aspx