48

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

最初はDjango-Southを使おうとしましたが、既知の問題が発生しました。

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

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で名前の変更を行おうとしています。最初に外部キーを削除してから名前を変更してから、外部キーを再度追加する必要があるようです。それは正しいですか?これはかなり混乱して面倒に見えるので、より良い方法はありますか?

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

4

6 に答える 6

57

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

于 2010-01-06T16:41:34.490 に答える
27

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

alter table customer_account drop foreign key `FK3FEDF2CC1CD51BAF`; 

alter table customer_account  add constraint `FK3FEDF2CCD115CB1A` foreign key (campaign_id) REFERENCES campaign(id);
于 2013-02-19T19:13:32.447 に答える
3

通常のキーのSQL構文は次のとおりです

ALTER TABLE `thetable`
  DROP KEY `oldkey`, 
  ADD KEY `newkey` (`tablefield`);
于 2012-09-28T15:56:36.847 に答える
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';
于 2015-04-12T14:29:07.170 に答える
0

@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);
于 2016-04-30T15:11:15.160 に答える