2010-01-06 78 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/

所以,現在我們正在試圖做的原始SQL重命名。看起來我們將不得不首先刪除外鍵,然後重命名,然後再次添加外鍵。這聽起來是對的嗎?有沒有更好的方法,因爲這看起來很混亂和麻煩?

任何幫助將不勝感激!

+0

可能重複http://stackoverflow.com/questions/6188011/how-do- i-rename -a-foreign-key-in-mysql) – Ben 2015-01-09 14:05:27

回答

41

AFAIK,刪除約束,然後重命名,然後添加約束返回是唯一的方法。先備份!

+5

由於MySQL 5.6.6,重命名列時現在所有外鍵都會自動更新。 http://dev.mysql.com/doc/refman/5.6/en/alter-table.html – BenL 2015-01-07 17:53:08

+2

@BenL這不完全正確。該頁面說:「在MySQL 5.6.6之前,在某些情況下,在同一個ALTER TABLE語句中添加和刪除一個外鍵可能會有問題,因此不受支持,每個操作都應該使用單獨的語句。 ,ALTER TABLE ... ALGORITHM = INPLACE支持在ALTER TABLE語句中添加和刪除外鍵,但對ALTER TABLE ... ALGORITHM = COPY不支持。「此外,我親眼看到MySQL 5.6.2在FK中替換了列名。但在MySQL 5.0.94中,這還不是可能的。 – hypercube 2015-05-28 12:55:54

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)由Hibernate生成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中的外鍵(