>  기사  >  백엔드 개발  >  [해결됨] 무결성 제약 조건 위반 – 빠른 팁

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

WBOY
WBOY원래의
2024-08-17 22:50:091003검색

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

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

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 마이그레이션 사용

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

아래 예에서는 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

위 내용은 [해결됨] 무결성 제약 조건 위반 – 빠른 팁의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.