2008-10-01 21 views
147

मैं mysql में यह करने की कोशिश की:mysql त्रुटि 1025 (HY000) क्या है: './foo' (errorno: 150) के नाम पर त्रुटि का मतलब है?

mysql> alter table region drop column country_id; 

और यह मिल गया:

ERROR 1025 (HY000): Error on rename of './product/#sql-14ae_81' to 
'./product/region' (errno: 150) 

कोई भी विचार? विदेशी कुंजी सामान?

+0

@skiphoppy - क्या आप पहले से दिए गए उत्तर के लिए बक्षीस देने की कोशिश कर रहे हैं? क्या यह भी अनुमति है? या आपका मामला अलग है, इस मामले में आपको एक और धागा शुरू करना चाहिए? –

+0

@ रिकजेम्स हां यह है। हालांकि, skiphoppy को उसके द्वारा चुने गए उत्तर के तहत अपनी टिप्पणी जोड़नी चाहिए, क्योंकि बक्षीस खत्म होने पर बोटी संदेश गायब हो जाएगा। – RandomSeed

उत्तर

219

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

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

CONSTRAINT region_ibfk_1 FOREIGN KEY (country_id) REFERENCES country (id) ON DELETE NO ACTION ON UPDATE NO ACTION

अब बस एक मुद्दा:

SHOW CREATE TABLE region;

यह आपको सूचकांक के नाम, कुछ इस तरह दिखाना चाहिए

alter table region drop foreign key region_ibfk_1 ;

और अंत में एक:

alter table region drop column country_id;

और आप जाने के लिए अच्छे हैं!

+8

अगर मैं इसे दो बार ऊपर उठा सकता हूं तो मैं चाहता हूं। चीयर्स! के माध्यम से महान चलना। – Rudiger

+10

यह सही जवाब होना चाहिए। धन्यवाद! – PinoyStackOverflower

+0

आपने मेरा बेकन बचाया। इस उत्तर के लिए धन्यवाद। मैंने Google खोज के माध्यम से समान समाधान देखा है, लेकिन आपका वास्तव में मेरे लिए काम करता है, धन्यवाद! – mason81

0

मुझे लगता है कि विदेशी कुंजी बाधा समस्या है। क्या Country_id किसी अन्य तालिका में एक विदेशी कुंजी के रूप में उपयोग किया जाता है?

मैं डीबी गुरु नहीं हूं लेकिन मुझे लगता है कि मैंने एफके को हटाकर, एक एफके बाधा को हटाकर, जहां एक एफके बाधा थी), मेरी तालिका तालिका को बदलकर और फिर एफके सामान को फिर से शुरू कर दिया।

मुझे यह जानने में दिलचस्पी होगी कि परिणाम क्या है - कभी-कभी mysql बहुत गूढ़ है।

+0

माईस्कल भयानक हो सकता है। आमतौर पर अच्छा है, लेकिन उन त्रुटि संदेशों, शीश। अगर हमें कार्यालय में किसी से संक्षिप्त स्पष्टीकरण मिलता है, तो मैं इसे यहां फेंक दूंगा। – Trenton

172

यह वास्तव में एक विदेशी कुंजी त्रुटि है, तो आप बाहर perror का उपयोग कर प्राप्त कर सकते हैं है:

shell$ perror 150 
MySQL error code 150: Foreign key constraint is incorrectly formed 

क्या विफल रहा है, आप SHOW ENGINE INNODB STATUS का उपयोग करें और नवीनतम विदेशी कुंजी त्रुटि अनुभाग इसमें लिए देख सकते हैं के बारे में अधिक जानकारी के पता लगाने के लिए क्या गलत है के बारे में विवरण।

आपके मामले में, यह संभवतः देश_आईडी कॉलम का संदर्भ दे रहा है।

+3

यह अच्छी पोस्ट है। मुझे समस्या खोजने में मदद करता है! – Scarlett

+1

अच्छा, मुझे पहले उस उपकरण से अवगत नहीं था। –

+1

ग्रेट उत्तर, thanx! – nightcoder

14

आप यह त्रुटि भी एक गैर-मौजूदा विदेशी कुंजी को छोड़ने का प्रयास कर सकते हैं। तो जब विदेशी कुंजी छोड़ते हैं, तो हमेशा सुनिश्चित करें कि वे वास्तव में मौजूद हैं।

विदेशी कुंजी मौजूद हैं करता है, और आप अभी भी निम्नलिखित इस त्रुटि की कोशिश हो रही है:

SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0; 
SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; 
SET @[email protected]@SQL_MODE, SQL_MODE='TRADITIONAL'; 

// यहाँ विदेशी कुंजी ड्रॉप!

SET [email protected]_SQL_MODE; 
SET [email protected]_FOREIGN_KEY_CHECKS; 
SET [email protected]_UNIQUE_CHECKS; 

यह हमेशा मेरे लिए काम कर देता है :)

+0

में इंजन की स्थिति पा सकते हैं, मुझे एक mysql त्रुटि के कारण तालिका के एक अलग वर्ण सेट पर स्विच करते समय इसकी आवश्यकता होती है: ERROR 1025 (एचवाई 000): './table/#sql-14ae_81' से (त्रुटि: 150) – letsjump

1

अपने mysql डेटाबेस के लिए त्रुटि फ़ाइल में एक नजर डालें। Bug #26305 के अनुसार मेरा एसक्यूएल आपको कारण नहीं देता है। यह बग MySQL 4.1 के बाद मौजूद है ;-)

+0

का नाम बदलने में त्रुटि मुझे आपके कुछ उत्तरों का पालन करना मुश्किल लगता है, लेकिन एक बग रिपोर्ट को जोड़ने के लिए +1। जाहिर है, अब यह MySQL v5.6.6 में तय किया गया है। :) – mwfearnley

1

यदि आप MySQL वर्कबेंच जैसे क्लाइंट का उपयोग कर रहे हैं, तो वांछित तालिका पर दायाँ क्लिक करें जहां से एक विदेशी कुंजी को हटाया जाना है, फिर विदेशी कुंजी टैब का चयन करें और अनुक्रमणिका हटाएं।

तो फिर तुम इस तरह क्वेरी चला सकते हैं:

alter table table_name drop foreign_key_col_name; 
5

आप ड्रॉप बयान में 'विदेशी कुंजी' के स्थान पर 'कुंजी' का उपयोग बदलने तालिका क्वेरी चलाते हैं। मुझे उम्मीद है कि यह इस मुद्दे को हल करने में मदद करेगा, और विदेशी कुंजी बाधा को छोड़ देगा और आप तालिका कॉलम बदल सकते हैं और तालिका छोड़ सकते हैं।

ALTER TABLE slide_image_sub DROP KEY FK_slide_image_sub; 
यहाँ DROP KEY बजाय DROP FOREIGN KEY में

,

आशा है कि यह मदद मिलेगी।

धन्यवाद

+0

आपको बहुत बहुत धन्यवाद; यह एकमात्र उत्तर है जिसने मेरी स्थिति को देखने में मदद की! – skiphoppy

1

संभवतः प्राथमिक कुंजी आप बदलना कोशिश कर रहे हैं को संदर्भित एक विदेशी कुंजी के साथ एक और टेबल है।

पता लगाने के लिए मेज की वजह से त्रुटि आप SHOW ENGINE INNODBSTATUS चला सकते हैं और फिर बाधा का नाम दिखाने के टेबल श्रेणियां बना LATEST FOREIGN KEY ERROR अनुभाग

शो उपयोग को देखो।

अधिकांश शायद यह

categories_ibfk_1 किया जाएगा तो विदेशी कुंजी पहले और स्तंभ ड्रॉप करने नाम का उपयोग करें:

ALTER TABLE categories DROP FOREIGN KEY categories_ibfk_1; 
ALTER TABLE categories DROP COLUMN assets_id; 
2

मैं एक इसी तरह के मुद्दों में एक बार किया था। मैंने तालिका ए से प्राथमिक कुंजी हटा दी लेकिन जब मैं तालिका बी से विदेशी कुंजी कॉलम को हटाने का प्रयास कर रहा था, तो मुझे उपर्युक्त त्रुटि दिखाई गई।

आप कॉलम नाम का उपयोग करके विदेशी कुंजी नहीं छोड़ सकते हैं और इसे PHPMyAdmin या MySQL में बाईपास करने के लिए, पहले विशेषता को नाम बदलने या हटाने से पहले विदेशी कुंजी बाधा को हटा दें।

0

मेरे मामले में, मैं MySQL वर्कबेंच का उपयोग कर रहा था और मुझे एक तालिका में अपने कॉलम में से एक को छोड़ते समय एक ही समस्या का सामना करना पड़ा। मुझे विदेशी कुंजी का नाम नहीं मिला। मैंने इस मुद्दे को हल करने के लिए निम्न चरणों का पालन किया:

  1. आरटी। अपनी स्कीमा पर क्लिक करें और 'स्कीमा इंस्पेक्टर' का चयन करें। यह आपको विभिन्न टेबल, कॉलम, इंडेक्स, ect देता है।

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

  3. अब क्वेरी निष्पादित करें: ALTER तालिका तालिका नाम बदलें DROP कुंजी विदेशीKeyName;

  4. अब आप ड्रॉप स्टेटमेंट निष्पादित कर सकते हैं जो सफलतापूर्वक निष्पादित करेगा।

1

मुझे पता है, यह एक पुरानी पोस्ट है, लेकिन यह हर किसी के पसंदीदा खोज इंजन पर पहली हिट है आप देख रहे हैं 1025

हालांकि त्रुटि के लिए, वहाँ है एक आसान यह तय करने के लिए "हैक" मुद्दा:

इससे पहले कि आप अपने आदेश (रों) निष्पादित आप पहली बार विदेशी कुंजी की कमी इस आदेश का उपयोग कर जांच को निष्क्रिय करने के लिए है:

SET FOREIGN_KEY_CHECKS = 0; 

तो फिर आप अपने आदेश पर अमल करने में सक्षम हैं (रों)। अपने प्रयास के साथ

SET FOREIGN_KEY_CHECKS = 1; 

गुड लक:

के बाद आप कर चुके हैं, विदेशी कुंजी की कमी सक्षम करने के लिए मत भूलना फिर से जांच, इस आदेश का उपयोग।

1

कर

SET FOREIGN_KEY_CHECKS=0; 

से पहले ऑपरेशन भी चाल कर सकते हैं।