मैं @Aaron Digulla और @Shane N से सहमत हूं। अंतराल व्यर्थ हैं। अगर वे करते हैं मतलब कुछ, यह एक त्रुटिपूर्ण डेटाबेस डिज़ाइन है। अवधि।
कहा जा रहा है, अगर आपको इन छेदों को भरना है, तो और आप कम से कम MySQL 3.23 चला रहे हैं, आप आईडी का एक नया सेट बनाने के लिए एक अस्थायी तालिका का उपयोग कर सकते हैं। यहां विचार यह है कि आप अपनी सभी मौजूदा आईडी को एक अस्थायी तालिका में क्रमानुसार चुनने जा रहे हैं:
CREATE TEMPORARY TABLE NewIDs
(
NewID INT UNSIGNED AUTO INCREMENT,
OldID INT UNSIGNED
)
INSERT INTO NewIDs (OldId)
SELECT
Id
FROM
OldTable
ORDER BY
Id ASC
NewId कॉलम की AUTO INCREMENT प्रॉपर्टी के कारण यह आपको अपनी पुरानी Id को एक बिलकुल नई Id से मैप करने वाली एक टेबल देगा जो कि प्रकृति में अनुक्रमिक होने वाली है।
एक बार यह हो जाने के बाद, आपको "ओल्डटेबल" में आईडी के किसी अन्य संदर्भ और इसके द्वारा उपयोग की जाने वाली किसी भी विदेशी कुंजी को अपडेट करना होगा। ऐसा करने के लिए, आपको संभवतः अपने पास मौजूद किसी भी विदेशी कुंजी बाधाओं को DROP करना होगा, OldId से NewId में तालिकाओं में किसी भी संदर्भ को अपडेट करना होगा, और फिर अपनी विदेशी कुंजी बाधाओं को फिर से स्थापित करना होगा।
हालांकि, मेरा तर्क है कि आपको कोई भी नहीं करना चाहिए इसमें से, और केवल यह समझें कि आपका आईडी फ़ील्ड एक रिकॉर्ड को संदर्भित करने के एकमात्र उद्देश्य के लिए मौजूद है, और नहीं होना चाहिए कोई विशिष्ट प्रासंगिकता है।
अपडेट करें:आईडी अपडेट करने का एक उदाहरण जोड़ना
उदाहरण के लिए:
मान लें कि आपके पास निम्नलिखित 2 टेबल स्कीमा हैं:
CREATE TABLE Parent
(
ParentId INT UNSIGNED AUTO INCREMENT,
Value INT UNSIGNED,
PRIMARY KEY (ParentId)
)
CREATE TABLE Child
(
ChildId INT UNSIGNED AUTO INCREMENT,
ParentId INT UNSIGNED,
PRIMARY KEY(ChildId),
FOREIGN KEY(ParentId) REFERENCES Parent(ParentId)
)
अब, आपके पेरेंट टेबल में गैप दिखाई दे रहे हैं।
माता-पिता और बच्चे में अपने मूल्यों को अपडेट करने के लिए, आप पहले मैपिंग के साथ एक अस्थायी तालिका बनाते हैं:
CREATE TEMPORARY TABLE NewIDs
(
Id INT UNSIGNED AUTO INCREMENT,
ParentID INT UNSIGNED
)
INSERT INTO NewIDs (ParentId)
SELECT
ParentId
FROM
Parent
ORDER BY
ParentId ASC
इसके बाद, हमें MySQL को विदेशी कुंजी बाधा को अनदेखा करने के लिए कहना होगा ताकि हम अपने मूल्यों को सही ढंग से अपडेट कर सकें। हम इस सिंटैक्स का उपयोग करेंगे:
SET foreign_key_checks = 0;
यह MySQL को मानों को अपडेट करते समय विदेशी कुंजी जांचों को अनदेखा करने का कारण बनता है, लेकिन यह अभी भी सही मान प्रकार को लागू करेगा (देखें MySQL संदर्भ ब्योरा हेतु)।
इसके बाद, हमें अपने माता-पिता और चाइल्ड टेबल को नए मानों के साथ अपडेट करना होगा। हम इसके लिए निम्नलिखित अद्यतन विवरण का उपयोग करेंगे:
UPDATE
Parent,
Child,
NewIds
SET
Parent.ParentId = NewIds.Id,
Child.ParentId = NewIds.Id
WHERE
Parent.ParentId = NewIds.ParentId AND
Child.ParentId = NewIds.ParentId
अब हमने अपने सभी पेरेंटआईड मूल्यों को हमारी अस्थायी तालिका से नए, आदेशित आईडी में सही ढंग से अपडेट कर दिया है। एक बार यह पूरा हो जाने पर, हम संदर्भात्मक अखंडता बनाए रखने के लिए अपनी विदेशी कुंजी जांचों को फिर से स्थापित कर सकते हैं:
SET foreign_key_checks = 1;
अंत में, हम संसाधनों को साफ करने के लिए अपनी अस्थायी तालिका छोड़ देंगे:
DROP TABLE NewIds
और वह है।