MySQLテーブルから制約を削除する方法は?


252

テーブルから制約を削除したい。私のクエリは:

ALTER TABLE `tbl_magazine_issue` 
DROP CONSTRAINT `FK_tbl_magazine_issue_mst_users`

しかし、エラーが発生しました:

#1064-SQL構文にエラーがあります。MySQLサーバーのバージョンに対応するマニュアルで、FK_tbl_magazine_issue_mst_users1行目で「制約」の近くで使用する正しい構文を確認してください


1
CHECK制約を作成した場合、実際の制約は作成されないため、削除する必要はありません。から選択しinformation_schema.table_constraintsて検証することができadd constraint、エラーなしで何度も繰り返し実行することもできます。MySQLはCHECK制約をサポートしていませんが、SQLを使用して(実際に制約を作成せずに)制約を作成できます。
ADTC



あなたの構文は完全に有効で、今サポートされているデモ
Lukasz Szozda

回答:


423

Mysqlには、外部キー制約を削除するための特別な構文があります。

ALTER TABLE tbl_magazine_issue
  DROP FOREIGN KEY FK_tbl_magazine_issue_mst_users

21
Postgres、MSSQL、Oracleにはすべてがありますalter table .. drop constraint。MySQLは奇妙なもののようです。
Jared Beck

外部キー制約で必要なため、「column2」を削除できないとあります。「Cant DROP column2; check that column / key exists」
Lealo

了解しました。外部は、列を他のテーブルの列に接続するだけの別個のものです。鉱山には標準的な名前が付けられていました。また、列自体を削除せずに安全に外部キーを削除できるようになりました
Lealo

1
ウェリントンロリンドのソリューションは、外部キーを削除するだけでは関連するインデックスが削除されないため、より正確であると考えることができます。もちろん、インデックスは個別に作成された可能性がありますが、最初に外部キーを追加した結果として作成された場合、外部キーをドロップするだけでは削除されません。
リッチハーディング

55

私は同じ問題を抱えていて、このコードで解決する必要がありました:

ALTER TABLE `table_name` DROP FOREIGN KEY `id_name_fk`;
ALTER TABLE `table_name` DROP INDEX  `id_name_fk`;

2
外部キーを削除するだけではインデックスは削除されないため、これは受け入れられたソリューションよりも正しいと見なすことができます。もちろん、インデックスは個別に作成された可能性がありますが、最初に外部キーを追加した結果として作成された場合、外部キーを削除するだけでは削除されません。
リッチハーディング

3
単一のコマンドとして: ALTER TABLE table_name DROP FOREIGN KEY IF EXISTS id_name_fk, DROP INDEX IF EXISTS id_name_fk;
Frank Forte

26

DROP CONSTRAINTMySQLのようなものはありません 。あなたの場合、DROP FOREIGN KEY代わりに使うことができます。


12

制約が外部キーでない場合。'UNIQUE CONSTRAINT(colA、colB)'を使用して追加されたものは、次を使用して削除できるインデックスです。ALTER TABLE ... DROP INDEX ...


9

また、mysqlデータベースからすべての外部キーチェックを一時的に無効 SET FOREIGN_KEY_CHECKS=0; にして、再び有効にすることもできます 。 SET FOREIGN_KEY_CHECKS=1;


8

Robert Knightの回答に少し追加すると、投稿のタイトル自体には外部キーが含まれていないため(そして彼の完全なコードサンプルがないため、SOのコメントコードブロックは回答のコードと同様に表示されないため)ブロック)、一意の制約のためにこれを追加します。これらのいずれかが制約を削除します。

ALTER TABLE `table_name` DROP KEY `uc_name`;

または

ALTER TABLE `table_name` DROP INDEX `uc_name`;

4

一部のORMまたはフレームワークは、FK_[parent table]_[referenced table]_[referencing field]変更できるため、デフォルトとは異なる外部キーの命名規則を使用します。

たとえば、Laravelは[parent table]_[referencing field]_foreign命名規則として使用します。次に示すように、このクエリを使用して外部キーの名前を表示できます

SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE REFERENCED_TABLE_SCHEMA = '<database>' AND REFERENCED_TABLE_NAME = '<table>';

次に、前述のDROP FOREIGN KEYクエリとその適切な名前を実行して、外部キーを削除します。


2

MariaDBを使用してここに来る人のために:

MariaDBでは、チェック制約の削除など、DROP CONSTRAINTステートメントを一般的に許可していることに注意してください。

ALTER TABLE table_name
DROP CONSTRAINT constraint_name;

https://mariadb.com/kb/en/library/alter-table/


はい、これは同じテーブル内にある制約用です(例:)CONSTRAINT CHECK(a > b)。外部キー制約の場合、DROP FOREIGN KEY少なくともMariaDBバージョン10.2
Frank Forte

1
  1. テーブルの構造ビューに移動します
  2. 上部に2つのオプションが表示されます。a。テーブルの構造b。リレーションビュー
  3. 次に、[ リレーションビュー ]をクリックします。ここで、外部キー制約を削除できます。ここですべての関係を取得します。

それは素晴らしいです
。ID

0

DROP CONSTRAINTMySqlにはありません。これはmysql 5.7の魔法のように動作します

ALTER TABLE answer DROP KEY const_name;

0

制約を削除する最も簡単な方法はALTER TABLE tbl_name DROP CONSTRAINT symbol;MySQL 8.0.19で導入された構文を使用することです

MySQL 8.0.19以降、ALTER TABLEは、任意のタイプの既存の制約を削除および変更するためのより一般的な(およびSQL標準)構文を許可します。制約タイプは制約名から決定されます。

ALTER TABLE tbl_magazine_issue DROP CONSTRAINT FK_tbl_magazine_issue_mst_users;

db <> fiddleデモ


-4

これはMySQLで動作し、制約を削除します

alter table tablename drop primary key;

alter table tablename drop foreign key;

DROP PRIMARY KEY動作しないはずです。DROP FOREIGN KEY動作しますが、誰にを指定する必要がありますdrop。例ALTER TABLE tablename DROP FOREIGN KEY id_name_fk
RousseauAlexandre
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.