22

多くのテーブルの外部キーであるテーブルの列の名前を変更したいと思います。どうやらこれは、このリンクで見つけたように、制約を削除した場合にのみ可能です。

すべての制約を手動で削除したくないデータベース内のすべての外部キー制約を削除する方法はありますか?

私も試しSET FOREIGN_KEY_CHECKS=0;ましたが、まだ列の名前を変更できません。

4

5 に答える 5

38

この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;
...

「スキーマ名」とは、データベース名を意味します。それは同じことです。

于 2015-09-24T13:01:46.233 に答える
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);
于 2013-01-27T11:06:20.747 に答える
1

次のクエリは、正しい構文を自動的に作成します。必ず実際の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名を取得するには

于 2015-04-12T14:39:34.560 に答える
0

このスレッドを見つけた後もまだ問題がありましたが、自分に合ったワークフローを見つけたようです。

データベースの削除

MySQL Workbenchを使用している場合は、次の3つの手順を実行して、SAFEUPDATEをオフにする必要があります。

  1. MySqlWorkbench>設定>SQLEDITOR>(設定の下部)
  2. SAFEUPDATEをオフにします
  3. 次に、接続からログアウトして再接続します

データベースのパージを開始して新規に開始する手順

  1. テーブルからすべてのデータを削除します

(このMySQLスクリプトは、データベース内のテーブルごとにDELETE FROMスクリプトを作成します。)

SELECT concat('DELETE FROM ',table_schema,'.',table_name,';') FROM information_schema.table_constraints WHERE table_schema='!!TABLE_SCHEMA!!';

これの出力をコピーして実行します。この行ごとに必要になる場合があります。

  1. テーブルからすべての外部キーを削除します

(この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スクリプトを実行できるようにする必要があります。

于 2018-11-05T20:42:22.070 に答える
-4

次のクエリを実行する

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

于 2013-01-27T11:07:06.430 に答える