webdevqa.jp.net

MySQLの外部キー列の名前変更

別のテーブルへの外部キーであるMySQL(5.1.31、InnoDB)の列の名前を変更しようとしています。

最初は、Django-Southを使用しようとしましたが、既知の問題に遭遇しました。

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

OperationalError:(1025、「 './ xxx /#sql-bf_4d'から './xxx/cave_event'への名前変更エラー(errno:150)」)

そして

「./xxx/#sql-bf_4b」から「./xxx/cave_event」への名前変更時のエラー(errno:150)

このエラー150は、間違いなく外部キー制約に関係しています。例参照.

mysqlエラー1025(HY000): './foo'の名前変更エラー(errorno:150)はどういう意味ですか?

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

そのため、今は生のSQLで名前を変更しようとしています。最初に外部キーを削除してから名前を変更し、外部キーを再度追加する必要があるようです。それは正しいですか?これはかなり混乱して面倒だと思われるので、より良い方法はありますか?

どんな助けでも大歓迎です!

44
Greg Detre

知っている限り、制約を削除してから名前を変更し、制約を追加し直すことが唯一の方法です。最初にバックアップしてください!

51
Dave Swersky

構文を探している人がいる場合は、次のようになります。

alter table customer_account drop foreign key `FK3FEDF2CC1CD51BAF`; 

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

ここに通常のキーのSQL構文があります

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

@Deweyの答えを拡張して、Hibernateによって生成されたFKを便利な方法で名前変更するための小さなスクリプト("FK__" + table name + "__" + referenced table name)

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);
0
Jan Żankowski

GUIツールを使用すると、このタスクはより簡単になります。 IntelliJ IDEA データベースツール を使用してID列の名前を変更しようとしましたが、それは魅力のように機能しました!テーブルまたは列の名前を変更するときに外部キーを気にする必要はありません。

詳細は IntelliJ IDEAヘルプ|アイテム名の変更 をご覧ください。

MySQL 5.7

0
naXa

次のクエリは、正しい構文を自動的に構築します。返された各行を実行するだけで、すべての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
Dewey