MySQL에서 다중 외래 키 문제 해결하기: 단계별 가이드

데이터베이스 작업, 특히 MySQL에서 작업할 때, 동일한 부모 테이블을 참조하는 다중 외래 키를 구현해야 하는 시나리오를 만날 수 있습니다. 이는 배송 세부 정보 테이블 내에서 다양한 공급업체를 연결하려고 할 때와 같이 많은 사용자가 직면하는 문제로, 특히 도전적일 수 있습니다. 이 게시물에서는 다중 외래 키에 대한 일반적인 질문을 탐구하고, 모범 사례를 포함한 구조화된 솔루션을 제공하며, 문제 해결 프로세스를 안내하겠습니다.

문제

SHIPPING_DETAILS 테이블이 배송 공급업체(예: FedEx 또는 UPS)와 제품 처리 공급업체(예: Dunder Mifflin)를 추적하는 역할을 한다고 가정해 보겠습니다. 이 경우 배송 세부 정보 내의 여러 열이 동일한 부모 테이블인 VENDOR를 참조해야 합니다. 그러나 이러한 열에 대한 외래 키 제약 조건을 정의하려고 할 때 여러 외래 키를 정의할 수 없는 등의 문제가 발생할 수 있습니다.

사용자는 종종 다음과 같은 오류를 경험합니다:

Can't create table './<DB_NAME>/SHIPPING_GRID.frm' (errno: 150)

이 오류는 일반적으로 외래 키 정의 또는 관련된 데이터 형식에 문제가 있음을 나타냅니다.

솔루션 개요

MySQL에서 다중 외래 키를 정의하는 문제를 해결하려면 다음 절차를 따르십시오:

  1. 테이블 구조 제대로 정의하기: VENDOR 테이블에 SHIPPING_DETAILS 테이블의 외래 키 열과 호환되는 고유한 기본 키가 있는지 확인하세요.

  2. 테이블 유형 수정하기: 두 테이블(VENDORSHIPPING_GRID)이 모두 InnoDB 유형인지 확인하세요. 다른 저장 엔진(예: MyISAM)에서는 외래 키 제약 조건이 지원되지 않으므로 매우 중요합니다.

  3. 데이터 형식 호환성 보장하기: 외래 키의 데이터 형식이 참조하는 기본 키의 데이터 형식과 일치하는지 확인하세요. 예를 들어, VENDOR.noINT(6)으로 정의되어 있으면 모든 외래 키 참조도 동일한 형식이어야 합니다.

  4. 중복 기본 키 정의 피하기: SQL 문서에 우연히 기본 키의 중복 정의가 포함되지 않도록 확인하십시오. 이는 테이블 생성 중 오류를 초래할 수 있습니다.

예제 코드

다음은 위의 사항을 고려한 후 SHIPPING_GRID 테이블을 올바르게 정의하는 방법의 수정된 예입니다:

CREATE TABLE SHIPPING_GRID(  
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '각 행에 대한 고유 ID',
    shipping_vendor_no INT(6) NOT NULL COMMENT '배송 공급업체를 위한 VENDOR.no의 외래 키 (vendors_type은 3이어야 함)',
    start_vendor_no INT(6) NOT NULL COMMENT '발송 공급업체를 위한 VENDOR.no의 외래 키',
    end_vendor_no INT(6) NOT NULL COMMENT '발송 대상 공급업체를 위한 VENDOR.no의 외래 키',
    shipment_duration INT(1) DEFAULT 1 COMMENT '배송에 소요되는 전체 일 수',
    price FLOAT(5,5) NOT NULL COMMENT '배송 lb당 가격(소수점 5자리까지)',
    is_flat_rate TINYINT(1) DEFAULT 0 COMMENT '중량에 관계없이 정액 가격이면 1; lb당 가격이면 0',
    INDEX (shipping_vendor_no),
    INDEX (start_vendor_no),
    INDEX (end_vendor_no),
    FOREIGN KEY (shipping_vendor_no) REFERENCES VENDOR (no),
    FOREIGN KEY (start_vendor_no) REFERENCES VENDOR (no),
    FOREIGN KEY (end_vendor_no) REFERENCES VENDOR (no)  
) ENGINE=InnoDB;

주요 사항

  • 데이터 형식 중요성: 외래 키 열이 참조하는 기본 키의 데이터 형식과 일치하는지 항상 확인하세요.
  • InnoDB 사용하기: 테이블 간에 외래 키를 설정하는 경우 InnoDB 엔진을 사용하는 것이 필수적입니다.
  • 중복 피하기: SQL에서 오류가 발생하면 중복 정의나 구문 문제를 다시 확인하세요.

이러한 지침을 따르면 다중 외래 키가 있는 테이블을 효과적으로 생성하고 외래 키 제약 조건과 관련된 일반적인 함정을 피할 수 있습니다. MySQL 작업에 행운이 있기를 바라며 행복한 코딩 되세요!