"무결성 제약 조건 위반: 하위 행을 추가하거나 업데이트할 수 없습니다. 외래 키 제약 조건이 실패합니다." 오류를 처리하는 경우 올바른 문서를 참조하세요.
일반적으로 테이블에 새 열을 추가하고 이를 외래 키로 선언할 때 이 오류가 발생합니다.
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);
고객 테이블에서 이 변경 작업을 실행하면 데이터베이스는 group_id 필드의 ID가 그룹 테이블에 존재하는지 확인합니다.
이 검사 중에 group_id 열이 여전히 비어 있어 그룹 테이블에 유효한 참조가 포함되어 있지 않기 때문에 데이터베이스에서 "무결성 위반 오류"가 발생합니다. 따라서 SQL 엔진이 외래 키 제약 조건을 적용하는 데 실패합니다. 빈 값은 그룹 테이블에 대한 유효한 외래 키가 아니기 때문입니다.
가장 간단한 작업은 새 열을 null 허용으로 선언하는 것입니다.
group_id 열에 null 값이 포함될 수 있도록 변경 쿼리에서 "NOT NULL" 명령을 제거할 수 있습니다.
이제 외래 키도 null이 될 수 있으므로 이 간단한 변경으로 우선 문제가 해결됩니다. 데이터 마이그레이션을 실행하여 최종적으로 고객 테이블의 새 group_id 열을 채우고 "NOT NULL" 제약 조건을 다시 도입하는 새 릴리스를 계획할 수 있습니다.
애플리케이션에서 특정 그룹 없이 고객이 존재할 수 없는 경우 group_id가 null을 허용하면 데이터베이스가 이 제약 조건을 인식하지 못한다는 점을 기억해야 합니다.
애플리케이션에서 엔터티 생성 중에 실수를 하면 데이터베이스에서 경고를 보내지 않습니다.
또 다른 해결 방법은 새 열을 추가하는 변경 쿼리와 외래 키를 추가하는 쿼리 사이에 데이터 마이그레이션 작업을 추가하는 것입니다.
고객 테이블에 새 group_id 열이 있으면 스크립트를 실행하여 그룹 테이블의 유효한 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
아래와 같이 마이그레이션을 두 부분으로 나눌 수 있습니다.
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를 무료로 사용해 보세요. 계정을 등록하세요.
또는 웹사이트에서 자세한 내용을 알아보세요: https://inspector.dev
위 내용은 [해결됨] 무결성 제약 조건 위반 – 빠른 팁의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!