MySQL

2010-01-06 9 views
40

में विदेशी-कुंजी कॉलम का नाम बदलना हम MySQL (5.1.31, InnoDB) में एक कॉलम का नाम बदलने का प्रयास कर रहे हैं जो कि किसी अन्य तालिका की एक विदेशी कुंजी है।MySQL

सबसे पहले, हम Django-दक्षिण का उपयोग करने की कोशिश की है, लेकिन यह एक ज्ञात समस्या के खिलाफ आया था:

http://south.aeracode.org/ticket/243

OperationalError: (1025, "Error on rename of './xxx/#sql-bf_4d' to './xxx/cave_event' (errno: 150)")

और

Error on rename of './xxx/#sql-bf_4b' to './xxx/cave_event' (errno: 150)

यह त्रुटि 150 निश्चित रूप से विदेशी से संबंधित है मुख्य बाधाएं उदाहरण देखें

What does mysql error 1025 (HY000): Error on rename of './foo' (errorno: 150) mean?

http://www.xaprb.com/blog/2006/08/22/mysqls-error-1025-explained/

तो, अब हम कच्चे एसक्यूएल में नाम करने के लिए कोशिश कर रहे हैं। ऐसा लगता है कि हमें पहले विदेशी कुंजी छोड़नी होगी, फिर नाम बदलें, और उसके बाद फिर से विदेशी कुंजी जोड़ें। क्या यह सही लगता है? क्या कोई बेहतर तरीका है, क्योंकि यह बहुत भ्रमित और बोझिल लगता है?

किसी भी मदद की बहुत सराहना की जाएगी!

+0

संभव डुप्लिकेट http://stackoverflow.com/questions/6188011/how-do- i-rename-a-foreign-key-in-mysql) – Ben

उत्तर

41

AFAIK, बाधा को छोड़कर, फिर नाम बदलें, फिर बाधा वापस जोड़ें एकमात्र तरीका है। पहले बैकअप!

+5

MySQL 5.6.6 के बाद, कॉलम का नाम बदलने पर सभी विदेशी कुंजी स्वचालित रूप से अपडेट हो जाती हैं। http://dev.mysql.com/doc/refman/5.6/en/alter-table.html – BenL

+2

@BenL यह पूरी तरह से सही नहीं है। पृष्ठ कहता है: "MySQL 5.6.6 से पहले, एक ही वैकल्पिक तालिका में एक विदेशी कुंजी जोड़ना और छोड़ना कुछ मामलों में समस्याग्रस्त हो सकता है और इसलिए असमर्थित है। प्रत्येक ऑपरेशन के लिए अलग-अलग कथन का उपयोग किया जाना चाहिए। MySQL 5.6.6 के रूप में , एक ही वैकल्पिक तालिका कथन में एक विदेशी कुंजी जोड़ना और छोड़ना वैकल्पिक तालिका के लिए समर्थित है ... ALGORITHM = INPLACE लेकिन ALTER तालिका के लिए असमर्थित रहता है ... ALGORITHM = COPY। "। इसके अलावा, मैंने अपनी आंखों के साथ देखा है MySQL 5.6.2 कॉलम नाम को एफके में बदल रहा है। लेकिन mySQL 5.0.94 में यह (अभी तक) संभव नहीं है। – hypercube

3

यहां नियमित कुंजी

ALTER TABLE `thetable` 
    DROP KEY `oldkey`, 
    ADD KEY `newkey` (`tablefield`); 
22

मामले में किसी को भी वाक्य रचना की तलाश में है के लिए SQL सिंटैक्स है यह कुछ इस तरह चला जाता है:

alter table customer_account drop foreign key `FK3FEDF2CC1CD51BAF`; 

alter table customer_account add constraint `FK3FEDF2CCD115CB1A` foreign key (campaign_id) REFERENCES campaign(id); 
0

निम्न क्वेरी सही सिंटैक्स स्वचालित रूप से निर्माण होगा। बस लौटाई गई प्रत्येक पंक्ति निष्पादित करें और आपके सभी FKEY चले जाएंगे।

मैं आपके लिए एक अभ्यास के रूप में रिवर्स (उन्हें वापस जोड़ना) छोड़ देता हूं।

SELECT CONCAT("alter table ", TABLE_NAME," drop foreign key `", CONSTRAINT_NAME,"`; ") AS runMe 
FROM information_schema.key_column_usage 
WHERE TABLE_SCHEMA='MY_SCHEMA_NAME'; 
0

@ डेवी के जवाब में विस्तार करते हुए, यहाँ एक उपयोगी तरीके से ("FK__" + table name + "__" + referenced table name) में हाइबरनेट द्वारा उत्पन्न FKS नाम बदलने के लिए एक छोटे से स्क्रिप्ट है।

SELECT CONCAT(
    "alter table ", TABLE_NAME, " drop foreign key ", CONSTRAINT_NAME,";\n", 
    "alter table ", TABLE_NAME, " drop key ", CONSTRAINT_NAME, ";\n", 
    "alter table ", TABLE_NAME, " add key FK__", table_name, "__", 
     referenced_table_name, " (", column_name, ");\n", 
    "alter table ", TABLE_NAME, " add constraint FK__", table_name, "__", 
     referenced_table_name , " foreign key (", column_name, ") ", 
     "references ", referenced_table_name, 
     "(", referenced_column_name, ");" 
) AS runMe 
FROM 
    information_schema.key_column_usage 
WHERE 
    TABLE_SCHEMA='myschemaname' 
    AND 
    constraint_name like 'FK_%'; 

उत्पादन के बारे में थोड़ी:

alter table visitor_browsers drop foreign key FK_4ygermmic4fujggq1kp96dx47; 
alter table visitor_browsers drop key FK_4ygermmic4fujggq1kp96dx47; 
alter table visitor_browsers add key FK__visitor_browsers__websites (website); 
alter table visitor_browsers add constraint FK__visitor_browsers__websites foreign key (website) references websites(id); 
की [? मैं mysql में एक विदेशी कुंजी का नाम बदलने कैसे करूँ] (