別のテーブルへの外部キーである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で名前を変更しようとしています。最初に外部キーを削除してから名前を変更し、外部キーを再度追加する必要があるようです。それは正しいですか?これはかなり混乱して面倒だと思われるので、より良い方法はありますか?
どんな助けでも大歓迎です!
知っている限り、制約を削除してから名前を変更し、制約を追加し直すことが唯一の方法です。最初にバックアップしてください!
構文を探している人がいる場合は、次のようになります。
alter table customer_account drop foreign key `FK3FEDF2CC1CD51BAF`;
alter table customer_account add constraint `FK3FEDF2CCD115CB1A` foreign key (campaign_id) REFERENCES campaign(id);
ここに通常のキーのSQL構文があります
ALTER TABLE `thetable`
DROP KEY `oldkey`,
ADD KEY `newkey` (`tablefield`);
@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);
GUIツールを使用すると、このタスクはより簡単になります。 IntelliJ IDEA データベースツール を使用してID列の名前を変更しようとしましたが、それは魅力のように機能しました!テーブルまたは列の名前を変更するときに外部キーを気にする必要はありません。
詳細は IntelliJ IDEAヘルプ|アイテム名の変更 をご覧ください。
次のクエリは、正しい構文を自動的に構築します。返された各行を実行するだけで、すべての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';