「整合性制約違反: 子行を追加または更新できません: 外部キー制約が失敗します」というエラーに対処している場合は、正しい記事を参照してください。
通常、このエラーは、テーブルに新しい列を追加し、それを外部キーとして宣言するときに発生します。
SQL データベースでは、外部キーは、別のテーブル内のデータ間のリンクを確立するために使用されるテーブル内のフィールドです。以下の顧客テーブルを考えてみましょう。
CREATE TABLE customers ( id INT PRIMARY KEY, name VARCHAR(255), email VARCHAR(255) );
次に、顧客をグループにリンクしたいとします。まず、グループ テーブルへの参照を含む新しい列を顧客テーブルに追加する必要があります:
# Create the new column "group_id" ALTER TABLE customers ADD COLUMN group_id INT NOT NULL;
外部キー制約を追加して、グループ テーブルとの関係をアクティブにすることができます:
# Add the FK constraints ALTER TABLE customers ADD CONSTRAINT fk_group_id FOREIGN KEY (group_id) REFERENCES customers(id);
customers テーブルに対してこの変更操作を実行すると、データベースは group_id フィールドの ID が groups テーブルに存在することを確認します。
このチェック中に、group_id 列がまだ空であり、グループ テーブルに有効な参照が含まれていないため、データベースは「整合性違反エラー」を発生させます。そのため、SQL エンジンは外部キー制約を適用しようとして失敗します。これは、空の値がグループ テーブルに対する有効な外部キーではないためです。
最も簡単なアクションは、新しい列を null 許容として宣言することです。
変更クエリから「NOT NULL」命令を削除して、group_id 列に NULL 値を含めることができます。
外部キーも null にできるようになったため、この単純な変更により、そもそも問題が解決されます。データ移行を実行して、最終的に顧客テーブルの新しい group_id 列を埋め、「NOT NULL」制約を再導入する新しいリリースを計画できます。
アプリケーション内で顧客が特定のグループなしでは存在できない場合、group_id が null 可能であるため、データベースはこの制約を認識しないことに注意してください。
アプリケーションでエンティティの作成中に間違いを犯した場合、データベースは警告しません。
もう 1 つの解決策は、新しい列を追加する変更クエリと外部キーを追加する変更クエリの間にデータ移行ジョブを追加することです。
customers テーブルに新しい group_id 列を作成したら、スクリプトを実行して、既存の行のこの列に、groups テーブルの有効な ID を入力できます。
これは、このタスクを実行するクエリの例です:
UPDATE customers, groups SET customers.group_id = groups.id Where customers.user_id = groups.user_id;
最新のアプリケーションでは、これらのタスクはすべて移行ツールを使用して実行されます。通常、最も一般的なアプリケーション開発フレームワークで使用できます。
以下の例では、Laravel の移行を使用して整合性制約違反の問題に対処する方法を示します。
移行を作成します:
php artisan make:migration add_goup_id_fk_to_customers –table=customers
次に示すように、移行を 2 つの部分に分けることができます:
use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Schema; return new class extends Migration { /** * Run the migrations. */ public function up(): void { Schema::create('customers', function (Blueprint $table) { $table->unsignedBigInteger('group_id')->nullable(); }); // Insert default data into the new column DB::raw('UPDATE customers, groups SET customers.group_id = groups.id WHERE customers.user_id = groups.user_id'); Schema::table('customers', function (Blueprint $table) { // Add the FK constraint $table->foreign('group_id')->references('id')->on(groups)->onDelete('cascade'); // Remove the nullable condition eventually; $table->unsignedBigInteger('group_id')->change(); }); } /** * Reverse the migrations. */ public function down(): void { Schema::table('customers', function (Blueprint $table) { $table->dropForeign('group_id'); $table->dropColumn('group_id'); }); } };
データベースのパフォーマンスの向上に興味がある場合は、「スマート データベース クエリ」に関する以下の記事を参照してください。
https://inspector.dev/how-to-accelerate-application-performance-with-smart-sql-queries/
Inspector は、ソフトウェア開発者向けに特別に設計されたコード実行監視ツールです。サーバー レベルで何もインストールする必要はありません。composer パッケージをインストールするだけで準備完了です。
他の複雑なオールインワン プラットフォームとは異なり、Inspector は非常に簡単で、PHP に優しいです。 Laravel または Symfony パッケージを試すことができます。
効果的な自動化、深い洞察、アラートや通知をメッセージング環境に転送する機能をお探しの場合は、Inspector を無料でお試しください。アカウントを登録してください。
または、Web サイトで詳細をご覧ください: https://inspector.dev
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3