मैं दो पहले से मौजूद तालिकाओं (आंशिक रूप से) जो देखो है मोटे तौर पर इस तरह:MySQL प्राथमिक कुंजी बदल देते हैं विदेशी कुंजी contraints मौजूद
CREATE TABLE parent (
old_pk CHAR(8) NOT NULL PRIMARY KEY
) ENGINE=InnoDB;
CREATE TABLE child (
parent_key CHAR(8),
FOREIGN KEY (parent_key) REFERENCES parent(old_pk)
ON UPDATE CASCADE ON DELETE CASCADE
) ENGINE=InnoDB;
मैं एक नया ऑटो बढ़ाने पूर्णांक parent
को id
स्तंभ जोड़ना चाहते हैं और इसके बजाय इसे प्राथमिक कुंजी के रूप में उपयोग करें, जबकि old_pk
को एक अनन्य कुंजी के रूप में रखते हुए और child
जैसे अन्य तालिकाओं को विदेशी कुंजी उल्लंघनों में संदर्भित करने की अनुमति दें। दुर्भाग्य से, बस कह ALTER TABLE parent DROP PRIMARY KEY
काम नहीं करता:
त्रुटि कोड: 1025
'./data/parent' को './data/#sql-4013_70f5e' (errno का नाम बदलने पर त्रुटि: 150)
कुछ googling से पता चलता है कि यह child
से मौजूदा विदेशी कुंजी संदर्भ के कारण है। संक्षेप में, मुझे MySQL को बताने का एक तरीका चाहिए "इस अन्य कॉलम को प्राथमिक कुंजी के रूप में उपयोग करें, लेकिन मूल की अनूठी-कुंजी-नज़र को न भूलें"। child
से मुख्य बाधाओं को छोड़ने और बाद में उन्हें बहाल करने के अलावा, इसे पूरा करने का कोई तरीका है?
मान लें कि मुझे उसी डेटा के साथ प्रतियां बनाने और बाद में उन्हें स्वैप करने के बजाय, तालिकाओं को स्थानांतरित करना होगा। मैंने टेबल को बदलने से पहले SET FOREIGN_KEY_CHECKS = 0
का उपयोग करने का प्रयास किया है, लेकिन यह मदद नहीं करता है।
है यही कारण है कि मैं उपयोगकर्ता के लिए दृश्यमान प्राथमिक कुंजी नहीं बनाते हैं (i से किराए की प्राथमिक कुंजी के लिए सभी कर रहा हूँ गेट-गो), उपयोगकर्ता बदलती आवश्यकताएं सिरदर्द हैं, लेकिन यह जानना अच्छा है कि आप अपना डेटाबेस उपयोग सरोगेट प्राथमिक कुंजी http://en.wikipedia.org/wiki/Surrogate_key –