MySQL テーブルを削除するときに外部キー制約を無視するシンプルな実装

MySQL テーブルを削除するときに外部キー制約を無視するシンプルな実装

テーブルを削除することはあまり一般的ではありませんが、特に外部キーの関連付けがあるテーブルの場合は、削除するときにより注意する必要があります。しかし、開発プロセス中にスキーマ設計に問題が見つかり、既存のデータベース内のすべてのテーブルを削除して再作成しなければならないことがよくあります。また、テスト中にデータベース内のすべてのテーブルを再作成する必要もあります。もちろん、多くの自動化ツールでもこれを行うことができます。

テーブルを削除するときに、次のようなエラー メッセージが表示される場合があります。

エラー 1217 (23000): 親行を削除または更新できません: 外部キー制約が失敗しました

これは、削除しようとしているテーブル内のフィールドが他のテーブルで外部キーとして使用されているため、このテーブル (親テーブル) を削除する前に、外部キーを持つテーブル (子テーブル) を削除する必要があります。つまり、テーブルを削除するプロセスは、テーブルを作成するプロセスと一貫している必要があります。

しかし、これは多くの場合受け入れられません。一方で、テーブルが多すぎる場合、手動での並べ替えは少し受け入れられません。他方では、現在、それらを並べ替える自動ツールはありません (実際、実現不可能ではありません)。そのため、MySQL では、必要に応じて外部キー制約をチェックするかどうかを設定するための変数 FOREIGN_KEY_CHECKS が用意されています。

一般的には、次のようにすることが推奨されます。

まず、すべての DROP ステートメントを自動的に生成し、MyDatabaseName をデータベース名に置き換えます。

SELECT concat('DROP TABLE IF EXISTS ', table_name, ';')
information_schema.tables から
ここで、table_schema = 'MyDatabaseName';

次に、生成されたコードの前後に FOREIGN_KEY_CHECKS 変数を設定する次のステートメントを追加します。

FOREIGN_KEY_CHECKS = 0 を設定します
-- DROP ステートメント SET FOREIGN_KEY_CHECKS = 1;

ただし、最後の文を忘れても、あまり問題にはなりません。この変数はセッションに基づいています。つまり、クライアントを閉じて再接続すると、この変数はデフォルト値に戻ります。外部キー制約をグローバルにチェックする必要がない場合 (この状況は比較的まれです)、次のようにします。

グローバルFOREIGN_KEY_CHECKSを0に設定します。

または

@@global.FOREIGN_KEY_CHECKS = 0 を設定します。

MySQL テーブルを削除するときに外部キー制約を無視する上記の簡単な実装は、エディターがあなたと共有するすべての内容です。これが参考になれば幸いです。また、123WORDPRESS.COM をサポートしていただければ幸いです。

以下もご興味があるかもしれません:
  • MySQL に外部キー制約を追加する具体的な方法
  • MySQL 外部キー制約 (FOREIGN KEY) ケースの説明
  • MySQL 外部キー制約とテーブル関係の概要
  • MySQL 外部キー制約の例の説明
  • MySQL 外部キー制約の詳細な説明
  • 外部キー制約を持つテーブルデータを削除する MySQL メソッドの紹介
  • MySQL 子テーブルで外部キー制約チェックを無効にする方法
  • MySQL で外部キー制約を作成および削除する方法

<<:  nestjs における例外フィルター Exceptionfilter の具体的な使用法

>>:  Centos7 に Zabbix3.0 をインストールするための非常に詳細な手順

推薦する

Docker5フル機能の港湾倉庫構築プロセス

Harbor は、Docker イメージを保存および配布するためのエンタープライズ レベルのレジスト...

HTMLページがincludeを使用してphpファイルをインポートした後に余分な空白行があります

インターネットで見つけた方法は効果的ですinclude によって導入されたフッター ファイルとヘッダ...

Web開発で使用される基本的な概念と技術の紹介

本日は、Web 開発で使われる基本的な概念と技術を初心者向けに紹介します。A から Z まで合計 2...

Linux SecureCRT の文字化けの解決方法

SecureCRT が文字化けした文字を表示する状況を見てみましょう。例えば: ではリセットしてみま...

HTML メタタグの一般的な使用例のコレクション

マタタグとは<meta> 要素は、検索エンジン向けの説明やキーワード、更新頻度など、ペー...

ラベルとボタンを削除し、背景画像の点線/影を追加すると完璧な解決策になります

ユーザーが登録すると、ラベルをクリックして確認コードを変更します。クリックするとラベルに影の部分がで...

CocosCreatorのホットアップデートの包括的な説明

目次序文ホットチェンジとはCocos Hot アップデートの概要マニフェストプロジェクトリソースとゲ...

MySQLとOracleの違いのまとめ(機能性能の比較、選択、使用時のSQLなど)

1. 同時実行性同時実行性は OLTP データベースの最も重要な機能ですが、同時実行性にはリソース...

elasticsearchを使用してインデックスデータを定期的に削除する

1. ESを使うこともあるリソースが限られている、またはビジネス上のニーズにより、最新の期間のデータ...

要素の属性を削除する JS removeAttribute() メソッド

JavaScript では、要素の removeAttribute() メソッドを使用して、指定され...

ログインインターフェースの使いやすさとセキュリティのバランスをとる方法

ウェブデザイナーでもUIデザイナーでも、ログインページや登録ページのデザインは必ず経験しなければなら...

MySQL での GROUP_CONCAT の使用例の分析

この記事では、例を使用して、MySQL で GROUP_CONCAT を使用する方法について説明しま...

Linux システムで MySQL の文字セットを UTF8 に変更する手順

目次1. データベース内の MySQL ステータスを確認します。 2. 設定ファイルを変更します。 ...

このリファレンスとJavaScriptのカスタムプロパティの詳細な説明

目次1. このキーワード2. カスタム属性3. 包括的なケース1:タブの実装付録要約する1. このキ...

MAC で Mysql5.7.10 のルートパスワードを変更する方法

まず、MySQLをskip-grant-tablesモードで起動します: mysqld --skip...