SQL Server의 외래 키 이해하기
관계형 데이터베이스를 설계할 때, 데이터 무결성을 유지하기 위해 테이블 간의 관계를 설정하는 것이 중요합니다. 이를 수행하는 한 가지 방법이 외래 키를 사용하는 것입니다. SQL Server에서 외래 키는 한 테이블의 필드(또는 필드 집합)로, 다른 테이블의 행을 고유하게 식별합니다. PostgreSQL과 같은 다른 데이터베이스 시스템에서 오신 경우, SQL Server의 구문 및 구현에서 차이를 발견할 수 있으며, 이는 혼란을 초래할 수 있습니다.
문제: 외래 키 생성하기
주어진 시나리오에서는 exams
, question_bank
, answer_bank
의 세 개의 테이블을 생성하려고 합니다. 목표는 question_bank
에 exams
테이블을 참조하는 외래 키를 생성하는 것입니다. 그러나 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 데이터베이스에서 외래 키를 성공적으로 구현할 수 있는 능력을 갖추게 될 것입니다.