多くのテーブルの外部キーであるテーブルの列の名前を変更したいと思います。どうやらこれは、このリンクで見つけたように、制約を削除した場合にのみ可能です。
すべての制約を手動で削除したくないデータベース内のすべての外部キー制約を削除する方法はありますか?
私も試しSET FOREIGN_KEY_CHECKS=0;
ましたが、まだ列の名前を変更できません。
多くのテーブルの外部キーであるテーブルの列の名前を変更したいと思います。どうやらこれは、このリンクで見つけたように、制約を削除した場合にのみ可能です。
すべての制約を手動で削除したくないデータベース内のすべての外部キー制約を削除する方法はありますか?
私も試しSET FOREIGN_KEY_CHECKS=0;
ましたが、まだ列の名前を変更できません。
このSQLを使用して、ALTER TABLESを生成できます(!!YOUR_SCHEMA_HERE!!
スキーマに置き換える必要があります)。
SELECT concat('alter table `',table_schema,'`.`',table_name,'` DROP FOREIGN KEY ',constraint_name,';')
FROM information_schema.table_constraints
WHERE constraint_type='FOREIGN KEY'
AND table_schema='!!YOUR_SCHEMA_HERE!!';
次のようなSQLが生成されます。
alter table `viewpoint_test`.`answer_code` DROP FOREIGN KEY fk_answer_code_codebook_item1;
alter table `viewpoint_test`.`answer_code` DROP FOREIGN KEY fk_answer_code_questionary_answer1;
alter table `viewpoint_test`.`codebook` DROP FOREIGN KEY codebook_ibfk_1;
...
「スキーマ名」とは、データベース名を意味します。それは同じことです。
次のように使用してみることができます..
ALTER TABLE tableName
DROP FOREIGN KEY fieldName;
ADD FOREIGN KEY (newForignKeyFieldName);
また、参照キーで試すこともできます。
ALTER TABLE tableName
DROP FOREIGN KEY fieldName;
ADD FOREIGN KEY (newForignKeyFieldName)
REFERENCES anotherTableName(reference_id);
次のクエリは、正しい構文を自動的に作成します。必ず実際のDBスキーマ名を条件に入れてくださいWHERE
。返された各行を実行するだけで、すべてFOREIGN KEYS
がなくなります。
私はあなたのための練習として逆を残します(それらを元に戻します)。
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' AND CONSTRAINT_NAME <> 'PRIMARY';
スキーマに依存しないようにする必要がある場合は、次のように記述できます。
TABLE_SCHEMA=DATABASE()
現在アクティブなDB名を取得するには
このスレッドを見つけた後もまだ問題がありましたが、自分に合ったワークフローを見つけたようです。
MySQL Workbenchを使用している場合は、次の3つの手順を実行して、SAFEUPDATEをオフにする必要があります。
(このMySQLスクリプトは、データベース内のテーブルごとにDELETE FROMスクリプトを作成します。)
SELECT concat('DELETE FROM ',table_schema,'.',table_name,';')
FROM information_schema.table_constraints
WHERE table_schema='!!TABLE_SCHEMA!!';
これの出力をコピーして実行します。この行ごとに必要になる場合があります。
(このMySqlスクリプトは、データベース内のテーブルごとに、ALTER TABLE _ DROP FOREIGN KEYスクリプトを作成します。)
SELECT concat('alter table ',table_schema,'.',table_name,' DROP FOREIGN KEY ',constraint_name,';')
FROM information_schema.table_constraints
WHERE constraint_type='FOREIGN KEY'
AND table_schema='!!TABLE_SCHEMA!!';
これの出力をコピーして実行します。この行ごとに必要になる場合があります。
これを実行した後、DROPDATABASEスクリプトを実行できるようにする必要があります。
次のクエリを実行する
select * from information_schema.key_column_usage
データベースに存在するすべての制約(列名、制約タイプ、テーブル、スキーマを含む)が表示されます。次の列に気付くでしょう。
CONSTRAINT_CATALOG
CONSTRAINT_SCHEMA
CONSTRAINT_NAME
TABLE_CATALOG
TABLE_SCHEMA
TABLE_NAME
COLUMN_NAME
ORDINAL_POSITION
POSITION_IN_UNIQUE_CONSTRAINT
REFERENCED_TABLE_SCHEMA
REFERENCED_TABLE_NAME
REFERENCED_COLUMN_NAME
次に、列を参照している各制約を削除することを計画している場合は、REFERENCED_ *列を検討し、次のように実行する必要があります。
DELETE FROM information_schema.key_column_usage
WHERE
REFERENCED_TABLE_SCHEMA='myschema'
AND
REFERENCED_TABLE_NAME='mytable'
AND
REFERENCED_COLUMN_NAME='mycolumn'
http://dev.mysql.com/doc/refman/5.1/en/key-column-usage-table.html