MySQLによる一部の外部キーの削除


190

主キーが他のいくつかのテーブルで使用され、他のテーブルへの外部キーがいくつかあるテーブルがあります。

CREATE TABLE location (
   locationID INT NOT NULL AUTO_INCREMENT PRIMARY KEY
   ...
) ENGINE = InnoDB;

CREATE TABLE assignment (
   assignmentID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
   locationID INT NOT NULL,
   FOREIGN KEY locationIDX (locationID) REFERENCES location (locationID)
   ...
) ENGINE = InnoDB;

CREATE TABLE assignmentStuff (
   ...
   assignmentID INT NOT NULL,
   FOREIGN KEY assignmentIDX (assignmentID) REFERENCES assignment (assignmentID)
) ENGINE = InnoDB;

問題は、外部キー列の1つ(つまり、locationIDX)を削除しようとすると、エラーが発生することです。

「エラー1025(HY000):名前変更のエラー」

このエラーを発生させずに、上の割り当てテーブルの列を削除するにはどうすればよいですか?

回答:


447

ここで説明するように、外部キー制約は、インデックス名ではなく制約名で削除する必要があるようです。構文は次のとおりです。

alter table footable drop foreign key fooconstraint

35
これが私の問題でした。今はちょっと馬鹿な感じです。他の誰かがこの問題を抱えている場合は、SHOW CREATE TABLE関数を使用して、外部キー制約名を見つけることができます。
ドリュー

14
ヒント:を使用SHOW CREATE TABLE footable;して、制約の名前を確認します。それ自体は列の名前ではありません。答えてくれてありがとう!
Chris Baker、

2
これを使用して外部キー制約を見つけることができます:SELECT * FROM information_schema.table_constraints WHERE constraint_schema = '<your db name>' AND constraint_type = 'FOREIGN KEY'
Gayan Dasanayake

21

外部キーはデータの整合性を確保するために存在するため、外部キーの一部である限り、列を削除できません。最初にキーをドロップする必要があります。

次のクエリでそれができると思います:

ALTER TABLE assignmentStuff DROP FOREIGN KEY assignmentIDX;

16

上記のように、FKは簡単に削除できます。ただし、ある時点でKEY自体を削除する必要があることに気づきました。最後のような別のインデックスを作成するためのエラーメッセージがある場合、つまり同じ名前を使用している場合、そのインデックスに関連するすべてを削除すると便利です。

ALTER TABLE your_table_with_fk
  drop FOREIGN KEY name_of_your_fk_from_show_create_table_command_result,
  drop KEY the_same_name_as_above

10

CONSTRAINT名とFOREIGN KEY名を確認します。

SHOW CREATE TABLE table_name;

CONSTRAINT名とFOREIGN KEY名の両方を削除します。

ALTER TABLE table_name
  DROP FOREIGN KEY the_name_after_CONSTRAINT,
  DROP KEY the_name_after_FOREIGN_KEY;

お役に立てれば!


4

外部キー制約を削除する方法を以下に示します。これは機能します。ALTER TABLE locationlocation_id DROP FOREIGN KEY location_ibfk_1;


2

ちょっと私は上記のシーケンスに従って、いくつかの解決策を見つけました。

SHOW CREATE TABLE footable;

次のようなFK制約名を取得します

ProjectsInfo_ibfk_1

次に、この制約を削除する必要があります。alter table commantd

alter table ProjectsInfo drop foreign key ProjectsInfo_ibfk_1;

次に、テーブルの列をドロップし、

alter table ProjectsInfo drop column clientId;

1

テーブルがInnoDBエンジンを使用している場合、通常このエラーが発生します。その場合は、外部キーを削除してから、テーブルを変更して列を削除する必要があります。

しかし、トリッキーな部分は、列名を使用して外部キーを削除できないことです。その代わりに、インデックスの作成に使用される名前を見つける必要があります。これを見つけるには、次の選択を発行します。

SHOW CREATE TABLE領域; これにより、行が表示されます。左上隅にある[+ option]をクリックし、[全文]をクリックし、[go]をクリックします。次のようなインデックスの名前が表示されます。

CONSTRAINT region_ibfk_1 FOREIGN KEY(country_id)REFERENCES country(id)ON DELETE NO ACTION ON UPDATE NO ACTION次に、単に次のコマンドを発行します。

テーブル領域を変更し、外部キーを削除しますregion_ibfk_1;

または

より単純に次のように入力するだけです:-テーブルのTableNameを変更する外部キーをドロップする TableName_ibfk_1 ;

唯一のことは 、テーブル名の後に_ibfk_1を追加 して次のようにすることです:-TableName _ibfk_1


0

外部キー列はテーブルから参照されているため、削除できませんassignmentStuff。したがって、最初に外部キー制約を削除する必要がありますassignmentStuff.assignmentIDX

同様の質問がすでにここで行われています。詳細については、こちらもご覧ください。


1
では、assignmentStuffは割り当ての主キーを参照するため、割り当てのlocationID列を削除できませんか?これは、直感に反するようなものです。
ドリュー

私はいくつかの列名を切り替えたようですので、私の答えは本当に意味がありません。申し訳ありません...
ロナルド・ウィルデンベルク


0

ステップ1: show create table vendor_locations;

ステップ2: ALTER TABLE vendor_locations drop foreign key vendor_locations_ibfk_1;

それは私のために働いた。


0

最初にこのクエリで実際の制約名を取得する必要があります

SHOW CREATE TABLE TABLE_NAME

このクエリは、外部キーの制約名を結果として生成しますが、以下のクエリはそれを削除します。

ALTER TABLE TABLE_NAME DROP FOREIGN KEY COLUMN_NAME_ibfk_1

上記の制約名の最後の数字は、テーブルにある外部キーの数によって異なります

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.