कुछ विदेशी कुंजी को हटाने MySQL


190

मेरे पास एक मेज है जिसका प्राथमिक कुंजी कई अन्य तालिकाओं में उपयोग किया जाता है और अन्य तालिकाओं के लिए कई विदेशी कुंजी हैं।

CREATE TABLE location (
   locationID INT NOT NULL AUTO_INCREMENT PRIMARY KEY
   ...
) ENGINE = InnoDB;

CREATE TABLE assignment (
   assignmentID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
   locationID INT NOT NULL,
   FOREIGN KEY locationIDX (locationID) REFERENCES location (locationID)
   ...
) ENGINE = InnoDB;

CREATE TABLE assignmentStuff (
   ...
   assignmentID INT NOT NULL,
   FOREIGN KEY assignmentIDX (assignmentID) REFERENCES assignment (assignmentID)
) ENGINE = InnoDB;

समस्या यह है कि जब मैं किसी एक विदेशी कुंजी कॉलम (यानी स्थान-स्थान पर) को छोड़ने की कोशिश कर रहा हूं तो यह मुझे एक त्रुटि देता है।

"त्रुटि 1025 (HY000): नाम बदलने में त्रुटि"

मैं इस त्रुटि को प्राप्त किए बिना ऊपर दिए गए असाइनमेंट टेबल में कॉलम को कैसे छोड़ सकता हूं?

जवाबों:


447

जैसा कि यहां बताया गया है , लगता है कि विदेशी कुंजी बाधा को बाधा नाम से नहीं बल्कि सूचकांक नाम से छोड़ना होगा। वाक्य रचना है:

alter table footable drop foreign key fooconstraint

35
यह मेरी समस्या थी। मैं अब गूंगा महसूस कर रहा हूं। यदि किसी और को यह समस्या है, तो आप SHOW CREATE TABLE फ़ंक्शन का उपयोग करके विदेशी कुंजी बाधा नाम पा सकते हैं।
ड्रयू

14
युक्ति: SHOW CREATE TABLE footable;यह देखने के लिए उपयोग करें कि बाधा का नाम क्या है। यह कॉलम-प्रति का नाम नहीं है। जवाब के लिए धन्यवाद!
क्रिस बेकर

2
आप विदेशी कुंजी बाधाओं का पता लगाने के लिए इसका उपयोग कर सकते हैं: SELECT * FROM info_schema.table_constraints WHERE constraint_schema = '<अपने db नाम>' और constraint_type = '
फ़ॉर डिज़ाइन

21

डेटा की अखंडता को सुनिश्चित करने के लिए विदेशी कुंजियाँ हैं, इसलिए जब तक आप एक विदेशी कुंजी का हिस्सा नहीं होते हैं, तब तक आप एक कॉलम को नहीं छोड़ सकते। आपको पहले कुंजी को छोड़ने की आवश्यकता है।

मुझे लगता है कि निम्नलिखित प्रश्न यह करेंगे:

ALTER TABLE assignmentStuff DROP FOREIGN KEY assignmentIDX;

16

जैसा कि सभी ने ऊपर कहा है, आप आसानी से एक FK को हटा सकते हैं। हालाँकि, मैंने अभी देखा कि कुछ बिंदु पर कुंजी को गिराना आवश्यक हो सकता है। यदि आपके पास पिछले एक की तरह एक और सूचकांक बनाने के लिए कोई त्रुटि संदेश है, तो मेरा मतलब उसी नाम से है, यह उस सूचकांक से संबंधित हर चीज को छोड़ने में उपयोगी होगा।

ALTER TABLE your_table_with_fk
  drop FOREIGN KEY name_of_your_fk_from_show_create_table_command_result,
  drop KEY the_same_name_as_above

10

CONSTRAINT नाम और FOREIGN KEY नाम क्या है, इसकी जाँच करें:

SHOW CREATE TABLE table_name;

CONSTRAINT नाम और FOREIGN KEY नाम दोनों को निकालें:

ALTER TABLE table_name
  DROP FOREIGN KEY the_name_after_CONSTRAINT,
  DROP KEY the_name_after_FOREIGN_KEY;

उम्मीद है की यह मदद करेगा!


4

यहां विदेशी कुंजी बाधा को छोड़ने का एक तरीका है, यह काम करेगा। पहले से बताएं locationlocation_id DROP FOREIGN KEY location_ibfk_1;


2

अरे मैंने ऊपर कुछ अनुक्रम का पालन किया, और कुछ समाधान पाया।

SHOW CREATE TABLE footable;

आपको FK Constrain Name जैसा मिलेगा

ProjectsInfo_ibfk_1

अब आपको इस अड़चन को दूर करने की आवश्यकता है। तालिका कमेंट में परिवर्तन करके

alter table ProjectsInfo drop foreign key ProjectsInfo_ibfk_1;

फिर टेबल कॉलम ड्रॉप करें,

alter table ProjectsInfo drop column clientId;

1

यदि आपकी तालिकाएँ InnoDB इंजन का उपयोग करती हैं, तो आपको आमतौर पर यह त्रुटि मिलती है। उस स्थिति में आपको विदेशी कुंजी छोड़नी होगी, और फिर परिवर्तन तालिका करें और स्तंभ को छोड़ें।

लेकिन मुश्किल हिस्सा यह है कि आप कॉलम नाम का उपयोग करके विदेशी कुंजी को नहीं छोड़ सकते हैं, बल्कि आपको इसे इंडेक्स करने के लिए उपयोग किया गया नाम ढूंढना होगा। इसे खोजने के लिए, निम्नलिखित चयन जारी करें:

शो टेबल टेबल क्षेत्र; यह आपको एक पंक्ति दिखाना चाहिए, बाएं ऊपरी कोने पर + विकल्प पर क्लिक करें, पूर्ण पाठ raio बटन पर क्लिक करें और फिर गो पर क्लिक करें। तब आपको सूचकांक का नाम मिलेगा, कुछ इस तरह से:

CONSTRAINT Region_ibfk_1 विदेश कुंजी (देश_आईडी) संदर्भ देश (आईडी) अद्यतन संख्या पर कोई टिप्पणी नहीं अब केवल एक अंक:

परिवर्तन तालिका क्षेत्र ड्रॉप विदेशी कुंजी area_ibfk_1;

या

और अधिक बस टाइप करें: - परिवर्तन तालिका TableName ड्रॉप विदेशी कुंजी TableName_ibfk_1 ;

अपने टैबलेन के बाद इस तरह बनाने के लिए _ibfk_1 जोड़ने के लिए केवल एक चीज याद रखें : - TableName _ibfk_1


0

आप विदेशी कुंजी कॉलम को नहीं छोड़ सकते क्योंकि यह तालिका से संदर्भित किया जा रहा है assignmentStuff। इसलिए आपको सबसे पहले विदेशी चाबी की कमी को छोड़ना चाहिए assignmentStuff.assignmentIDX

इसी तरह का सवाल यहां पहले ही पूछा जा चुका है । अधिक जानकारी के लिए यहां भी देखें ।


1
इसलिए, क्योंकि असाइनमेंटस्टाफ संदर्भ असाइनमेंट की प्राथमिक कुंजी है, मैं असाइनमेंट के स्थान कॉलम को नहीं छोड़ सकता? यह एक तरह का काउंटर सहज लगता है।
ड्रयू

ऐसा लगता है कि मैंने कुछ कॉलम नामों को स्विच किया है ताकि मेरा जवाब वास्तव में समझ में न आए। इसके लिए क्षमा करें ...
रोनाल्ड वाइल्डबर्ग


0

चरण 1: show create table vendor_locations;

चरण 2: ALTER TABLE vendor_locations drop foreign key vendor_locations_ibfk_1;

यह मेरे लिए काम किया।


0

पहले इस क्वेरी द्वारा वास्तविक विवश नाम प्राप्त करने की आवश्यकता है

SHOW CREATE TABLE TABLE_NAME

इस क्वेरी से विदेशी कुंजी का नाम बदल जाएगा, अब नीचे क्वेरी इसे छोड़ देगी।

ALTER TABLE TABLE_NAME DROP FOREIGN KEY COLUMN_NAME_ibfk_1

उपरोक्त बाधा नाम में अंतिम संख्या इस बात पर निर्भर करती है कि आपके पास तालिका में कितनी विदेशी कुंजियाँ हैं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.