SQL Server의 외래 키 이해하기

관계형 데이터베이스를 설계할 때, 데이터 무결성을 유지하기 위해 테이블 간의 관계를 설정하는 것이 중요합니다. 이를 수행하는 한 가지 방법이 외래 키를 사용하는 것입니다. SQL Server에서 외래 키는 한 테이블의 필드(또는 필드 집합)로, 다른 테이블의 행을 고유하게 식별합니다. PostgreSQL과 같은 다른 데이터베이스 시스템에서 오신 경우, SQL Server의 구문 및 구현에서 차이를 발견할 수 있으며, 이는 혼란을 초래할 수 있습니다.

문제: 외래 키 생성하기

주어진 시나리오에서는 exams, question_bank, answer_bank의 세 개의 테이블을 생성하려고 합니다. 목표는 question_bankexams 테이블을 참조하는 외래 키를 생성하는 것입니다. 그러나 SQL 코드를 실행할 때 오류가 발생합니다. 오류 메시지는 다음과 같습니다:

Msg 8139, Level 16, State 0, Line 9 외래 키에서 참조하는 열의 수가 참조되는 열의 수와 다릅니다. 테이블 ‘question_bank’.

이것은 외래 키 정의에 불일치가 있음을 나타냅니다.

해결책: 외래 키 올바르게 정의하기

1단계: 테이블 정의 검토하기

question_bank 테이블에서 외래 키를 올바르게 설정하는 방법을 자세히 살펴보겠습니다.

현재 테이블 설정

원래 SQL은 question_bank 테이블을 다음과 같이 생성했습니다:

create table question_bank
(
    question_id uniqueidentifier primary key,
    question_exam_id uniqueidentifier not null,
    question_text varchar(1024) not null,
    question_point_value decimal,
    constraint question_exam_id foreign key references exams(exam_id)
);

외래 키는 exams 테이블의 exam_id를 참조하도록 설정되지만 올바른 구문과 구조가 부족합니다.

2단계: 외래 키 정의 업데이트하기

외래 키 관계를 올바르게 정의하려면 외래 키 열(question_exam_id)이 참조 테이블의 기본 키(exam_id)와 어떻게 관련되어 있는지를 명시해야 합니다:

create table question_bank
(
    question_id uniqueidentifier primary key,
    question_exam_id uniqueidentifier not null,
    question_text varchar(1024) not null,
    question_point_value decimal,
    constraint fk_questionbank_exams foreign key (question_exam_id) references exams (exam_id)
);

주요 변경 사항:

  • 외래 키 이름 지정: 외래 키 제약 조건에 이름을 부여하는 것이 좋습니다 (예: fk_questionbank_exams) 명확성을 위해.
  • 외래 키 열 올바르게 참조: 외래 키가 참조 테이블의 올바른 열을 참조하도록 보장합니다.

3단계: 변경 사항 적용하기

이제 기존의 question_bank 테이블을 삭제하고(존재하는 경우) 수정된 외래 키 정의를 사용하여 다시 생성할 수 있습니다:

drop table if exists question_bank;

create table question_bank
(
    question_id uniqueidentifier primary key,
    question_exam_id uniqueidentifier not null,
    question_text varchar(1024) not null,
    question_point_value decimal,
    constraint fk_questionbank_exams foreign key (question_exam_id) references exams (exam_id)
);

결론

SQL Server에서 외래 키를 설정하는 것은 데이터 무결성을 보장하고 테이블 간의 관계를 설정하는 데 중요한 단계입니다. 외래 키 제약 조건을 주의 깊게 정의하고 구문 문제를 수정함으로써 강력하고 효율적인 데이터베이스 디자인을 만들 수 있습니다.

오류가 발생할 경우 항상 외래 키 정의를 확인하여 참조하는 열이 참조된 열과 올바르게 일치하는지 확인하세요. 이 가이드를 통해 SQL Server 데이터베이스에서 외래 키를 성공적으로 구현할 수 있는 능력을 갖추게 될 것입니다.