"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > [해결됨] 무결성 제약 조건 위반 – 빠른 팁

[해결됨] 무결성 제약 조건 위반 – 빠른 팁

2024-08-25에 게시됨
검색:430

"무결성 제약 조건 위반: 하위 행을 추가하거나 업데이트할 수 없습니다. 외래 키 제약 조건이 실패합니다"라는 오류를 처리하는 경우 올바른 문서를 참조하세요.

일반적으로 테이블에 새 열을 추가하고 이를 외래 키로 선언할 때 이 오류가 발생합니다.

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 허용으로 선언하는 것입니다.

변경 쿼리에서 "NOT NULL" 명령을 제거하면 group_id 열에 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 마이그레이션 사용

최신 애플리케이션에서는 이러한 모든 작업이 마이그레이션 도구를 사용하여 수행됩니다. 일반적으로 가장 일반적인 애플리케이션 개발 프레임워크에서 사용할 수 있습니다.

아래 예에서는 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를 처음 사용하시나요? 무료로 애플리케이션을 모니터링하세요

Inspector는 소프트웨어 개발자를 위해 특별히 설계된 코드 실행 모니터링 도구입니다. 서버 수준에서 아무것도 설치할 필요가 없습니다. composer 패키지만 설치하면 바로 사용할 수 있습니다.

다른 복잡한 올인원 플랫폼과 달리 Inspector는 매우 쉽고 PHP 친화적입니다. Laravel 또는 Symfony 패키지를 사용해 볼 수 있습니다.

효과적인 자동화, 심층적인 통찰력, 경고 및 알림을 메시징 환경으로 전달하는 기능을 찾고 있다면 Inspector를 무료로 사용해 보세요. 계정을 등록하세요.

또는 웹사이트에서 자세한 내용을 알아보세요: https://inspector.dev

[Resolved] Integrity constraint violation – Fast tips

릴리스 선언문 이 글은 https://dev.to/inspector/resolved-integrity-constraint-violation-fast-tips-9eb?1에서 복제됩니다.1 침해 내용이 있는 경우, [email protected]으로 연락하여 삭제하시기 바랍니다.
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3