SQL에서 기본 키와 외래 키의 정의와 역할을 이해하기

SQL에서 기본 키와 외래 키는 데이터베이스 설계에 없어서는 안 될 개념입니다. 기본 키는 각 레코드를 고유하게 식별하고, 외래 키는 서로 다른 테이블 간의 관계를 구축합니다. 본 기사에서는 이러한 키의 정의, 역할, 설정 방법을 구체적인 예와 함께 자세히 설명하여 데이터베이스 설계에 대한 이해를 돕습니다.

목차

기본 키의 정의와 역할

기본 키(Primary Key)는 데이터베이스 테이블 내에서 각 레코드를 고유하게 식별하기 위한 키입니다. 기본 키는 테이블 내에서 고유해야 하며, NULL 값을 포함할 수 없습니다. 각 테이블에 하나의 기본 키를 설정하는 것이 권장되며, 이를 통해 데이터의 무결성을 보장합니다.

기본 키의 특징

  • 고유성: 기본 키는 각 레코드를 고유하게 식별하므로 동일한 값을 가질 수 없습니다.
  • 비NULL: 기본 키는 NULL 값을 포함할 수 없습니다.
  • 한 테이블에 하나: 각 테이블에는 하나의 기본 키가 필요합니다.

기본 키의 역할

기본 키는 다음과 같은 역할을 합니다.

  • 레코드의 고유 식별: 각 레코드를 고유하게 식별하여 데이터 중복을 방지합니다.
  • 관계의 기반: 다른 테이블과의 관계를 구축하는 기반이 됩니다.

외래 키의 정의와 역할

외래 키(Foreign Key)는 한 테이블의 열이 다른 테이블의 기본 키를 참조하는 데 사용됩니다. 외래 키는 테이블 간의 관계를 정의하고 데이터의 무결성을 유지하는 데 중요합니다.

외래 키의 특징

  • 참조성: 외래 키는 다른 테이블의 기본 키를 참조합니다.
  • 무결성: 참조된 데이터가 존재함을 보장합니다.
  • NULL 허용: 외래 키 열은 NULL을 허용할 수도 있습니다.

외래 키의 역할

외래 키는 다음과 같은 역할을 합니다.

  • 관계 구축: 테이블 간의 관계를 명확히 하고, 데이터 간의 연결을 보장합니다.
  • 데이터 무결성 유지: 참조하는 데이터가 존재하지 않을 경우, 데이터베이스는 해당 데이터를 추가하거나 업데이트하지 못하게 합니다.

외래 키의 사용은 데이터베이스의 정확성과 무결성을 유지하는 데 필수적입니다.

기본 키와 외래 키의 차이

기본 키와 외래 키는 모두 데이터베이스 설계에서 중요한 역할을 하지만, 각각의 역할과 특성에는 명확한 차이가 있습니다.

기본 키의 특징과 역할

  • 고유성: 기본 키는 각 레코드를 고유하게 식별합니다.
  • 비NULL: 기본 키는 NULL 값을 포함할 수 없습니다.
  • 한 테이블에 하나: 각 테이블에 하나의 기본 키가 필요합니다.

외래 키의 특징과 역할

  • 참조성: 외래 키는 다른 테이블의 기본 키를 참조합니다.
  • 무결성: 외래 키는 참조하는 데이터가 존재함을 보장합니다.
  • NULL 허용: 경우에 따라 외래 키 열에 NULL 값을 포함할 수 있습니다.

기본 키와 외래 키의 차이

  • 목적: 기본 키는 테이블 내의 레코드를 고유하게 식별하는 데 사용되며, 외래 키는 테이블 간의 관계를 구축하는 데 사용됩니다.
  • 유니크 제약: 기본 키는 항상 고유해야 하며, NULL을 포함할 수 없지만 외래 키는 참조되는 기본 키 값일 경우 유니크하지 않아도 됩니다.
  • 설정 범위: 기본 키는 한 테이블에 하나만 존재할 수 있지만, 외래 키는 한 테이블에 여러 개 존재할 수 있습니다.

이러한 차이를 이해함으로써 데이터베이스 설계 시 적절하게 기본 키와 외래 키를 사용할 수 있습니다.

기본 키 설정 방법

기본 키를 설정하는 SQL 명령은 간단하며, 테이블을 생성할 때 지정할 수 있습니다. 또한 기존 테이블에도 나중에 설정할 수 있습니다. 아래에 그 구체적인 방법을 보여드립니다.

테이블 생성 시 기본 키 설정하기

테이블을 생성할 때 기본 키를 설정하는 방법을 소개합니다. 아래는 Users 테이블의 user_id를 기본 키로 설정하는 예입니다.

CREATE TABLE Users (  
    user_id INT NOT NULL,  
    username VARCHAR(50),  
    email VARCHAR(50),  
    PRIMARY KEY (user_id)  
);

코드 설명

  • CREATE TABLE Users: Users라는 이름의 테이블을 생성합니다.
  • user_id INT NOT NULL: user_id 열을 정수형으로 설정하고, NULL을 허용하지 않습니다.
  • PRIMARY KEY (user_id): user_id 열을 기본 키로 설정합니다.

기존 테이블에 기본 키 추가하기

기존 테이블에 기본 키를 추가하는 방법을 소개합니다. 아래는 기존 Orders 테이블에 order_id를 기본 키로 추가하는 예입니다.

ALTER TABLE Orders  
ADD PRIMARY KEY (order_id);

코드 설명

  • ALTER TABLE Orders: Orders 테이블을 변경합니다.
  • ADD PRIMARY KEY (order_id): order_id 열을 기본 키로 추가합니다.

기본 키를 올바르게 설정하면, 데이터베이스 내의 데이터의 고유성과 무결성을 유지할 수 있습니다.

외래 키 설정 방법

외래 키를 설정하는 SQL 명령은 테이블을 생성할 때 또는 기존 테이블에 대해 설정할 수 있습니다. 외래 키를 올바르게 설정하면, 테이블 간의 관계를 구축하고 데이터의 무결성을 유지할 수 있습니다.

테이블 생성 시 외래 키 설정하기

테이블을 생성할 때 외래 키를 설정하는 방법을 소개합니다. 아래는 Orders 테이블의 customer_idCustomers 테이블의 customer_id와 연결하는 예입니다.

CREATE TABLE Customers (  
    customer_id INT NOT NULL,  
    customer_name VARCHAR(100),  
    PRIMARY KEY (customer_id)  
);  

CREATE TABLE Orders (  
    order_id INT NOT NULL,  
    order_date DATE,  
    customer_id INT,  
    PRIMARY KEY (order_id),  
    FOREIGN KEY (customer_id) REFERENCES Customers(customer_id)  
);

코드 설명

  • CREATE TABLE Customers: Customers라는 이름의 테이블을 생성합니다.
  • PRIMARY KEY (customer_id): customer_id 열을 기본 키로 설정합니다.
  • CREATE TABLE Orders: Orders라는 이름의 테이블을 생성합니다.
  • FOREIGN KEY (customer_id) REFERENCES Customers(customer_id): customer_id 열을 Customers 테이블의 customer_id 열과 연결합니다.

기존 테이블에 외래 키 추가하기

기존 테이블에 외래 키를 추가하는 방법을 소개합니다. 아래는 기존 Orders 테이블에 customer_id를 외래 키로 추가하는 예입니다.

ALTER TABLE Orders  
ADD CONSTRAINT fk_customer  
FOREIGN KEY (customer_id) REFERENCES Customers(customer_id);

코드 설명

  • ALTER TABLE Orders: Orders 테이블을 변경합니다.
  • ADD CONSTRAINT fk_customer: fk_customer라는 이름의 제약을 추가합니다.
  • FOREIGN KEY (customer_id) REFERENCES Customers(customer_id): customer_id 열을 Customers 테이블의 customer_id 열과 연결합니다.

외래 키를 올바르게 설정하면, 데이터베이스의 관계를 구축하고 데이터의 무결성을 유지할 수 있습니다.

기본 키와 외래 키를 사용한 테이블 설계 예시

기본 키와 외래 키를 사용하여 구체적인 테이블 설계 예시를 보여드립니다. 이 설계 예시에서는 고객 정보와 주문 정보를 관리하는 데이터베이스를 구축합니다.

고객 테이블 설계

먼저, 고객 정보를 관리하는 Customers 테이블을 설계합니다. 이 테이블에서는 customer_id를 기본 키로 사용합니다.

CREATE TABLE Customers (  
    customer_id INT NOT NULL AUTO_INCREMENT,  
    customer_name VARCHAR(100) NOT NULL,  
    contact_email VARCHAR(100),  
    PRIMARY KEY (customer_id)  
);

코드 설명

  • customer_id INT NOT NULL AUTO_INCREMENT: customer_id는 정수형으로 자동 증가하고, NULL을 허용하지 않습니다.
  • PRIMARY KEY (customer_id): customer_id 열을 기본 키로 설정합니다.

주문 테이블 설계

다음으로, 주문 정보를 관리하는 Orders 테이블을 설계합니다. 이 테이블에서는 order_id를 기본 키로 사용하고, customer_id를 외래 키로 설정하여 Customers 테이블의 customer_id를 참조합니다.

CREATE TABLE Orders (  
    order_id INT NOT NULL AUTO_INCREMENT,  
    order_date DATE NOT NULL,  
    customer_id INT,  
    PRIMARY KEY (order_id),  
    FOREIGN KEY (customer_id) REFERENCES Customers(customer_id)  
);

코드 설명

  • order_id INT NOT NULL AUTO_INCREMENT: order_id는 정수형으로 자동 증가하고, NULL을 허용하지 않습니다.
  • order_date DATE NOT NULL: order_date는 날짜형으로 NULL을 허용하지 않습니다.
  • FOREIGN KEY (customer_id) REFERENCES Customers(customer_id): customer_id 열을 Customers 테이블의 customer_id 열과 연결합니다.

테이블 간의 관계

이 설계를 통해 Customers 테이블과 Orders 테이블은 customer_id를 통해 연결됩니다. 이를 통해 특정 고객이 한 모든 주문을 쉽게 추적할 수 있습니다.

기본 키와 외래 키에 관한 자주 묻는 질문과 답변

기본 키와 외래 키에 대해 많은 사람들이 궁금해하는 부분이 있습니다. 여기에서는 자주 묻는 질문과 그에 대한 답변을 정리했습니다.

질문1: 기본 키는 여러 열로 구성할 수 있나요?

답변: 네, 기본 키는 여러 열을 조합하여 구성할 수 있습니다. 이를 복합 키(Composite Key)라고 합니다. 예를 들어, Orders 테이블에서 order_idproduct_id의 조합을 기본 키로 설정할 수 있습니다.

CREATE TABLE OrderDetails (  
    order_id INT NOT NULL,  
    product_id INT NOT NULL,  
    quantity INT,  
    PRIMARY KEY (order_id, product_id)  
);

질문2: 외래 키는 다른 테이블의 어느 열이라도 참조할 수 있나요?

답변: 외래 키는 다른 테이블의 기본 키 또는 유니크 키를 참조해야 합니다. 이를 통해 데이터의 무결성이 유지됩니다.

질문3: 기본 키를 변경할 수 있나요?

답변: 기본 키를 변경하는 것은 가능하지만, 신중하게 해야 합니다. 변경하기 전에 기존 데이터나 관계에 미치는 영향을 평가해야 합니다.

질문4: 외래 키 설정은 필수인가요?

답변: 외래 키 설정은 필수는 아니지만, 설정함으로써 테이블 간의 관계를 명확히 하고 데이터의 무결성을 유지할 수 있습니다.

질문5: 외래 키는 NULL 값을 포함할 수 있나요?

답변: 외래 키는 NULL 값을 포함할 수 있습니다. 하지만 그 경우 관계가 없음을 의미합니다.

이 질문과 답변을 참고하여 기본 키와 외래 키에 대한 이해를 깊이 있게 할 수 있습니다.

연습 문제

여기에서는 기본 키와 외래 키의 개념을 실전에서 이해하기 위한 연습 문제를 준비했습니다. 이 문제들을 풀어보면서 실제 데이터베이스 설계에서 이러한 키의 사용 방법을 확인할 수 있습니다.

연습 문제1: 테이블 생성

다음 요구 사항을 충족하는 Products 테이블을 생성하세요.

  • product_id를 기본 키로 설정할 것
  • product_name은 NULL을 허용하지 않을 것
  • price는 NULL을 허용할 것
-- 답안을 여기에 작성하세요  
CREATE TABLE Products (  
    product_id INT NOT NULL,  
    product_name VARCHAR(100) NOT NULL,  
    price DECIMAL(10, 2),  
    PRIMARY KEY (product_id)  
);

연습 문제2: 외래 키 설정

다음 요구 사항을 충족하는 OrderItems 테이블을 생성하고, OrdersProducts 테이블과의 관계를 구축하세요.

  • order_item_id를 기본 키로 설정할 것
  • order_idOrders 테이블의 order_id에 외래 키로 설정할 것
  • product_idProducts 테이블의 product_id에 외래 키로 설정할 것
-- 답안을 여기에 작성하세요  
CREATE TABLE OrderItems (  
    order_item_id INT NOT NULL AUTO_INCREMENT,  
    order_id INT NOT NULL,  
    product_id INT NOT NULL,  
    quantity INT,  
    PRIMARY KEY (order_item_id),  
    FOREIGN KEY (order_id) REFERENCES Orders(order_id),  
    FOREIGN KEY (product_id) REFERENCES Products(product_id)  
);

연습 문제3: 데이터 삽입 및 관계 확인

Customers, Orders, OrderItems 테이블에 데이터를 삽입하고, 각 테이블 간의 관계가 올바르게 작동하는지 확인하세요.

-- 샘플 데이터 삽입  
INSERT INTO Customers (customer_name, contact_email) VALUES ('John Doe', 'john@example.com');  
INSERT INTO Orders (order_date, customer_id) VALUES ('2024-06-05', 1);  
INSERT INTO Products (product_name, price) VALUES ('Laptop', 1000.00);  
INSERT INTO OrderItems (order_id, product_id, quantity) VALUES (1, 1, 2);  

-- 관계 확인 쿼리  
SELECT * FROM Orders  
JOIN OrderItems ON Orders.order_id = OrderItems.order_id  
JOIN Products ON OrderItems.product_id = Products.product_id  
JOIN Customers ON Orders.customer_id = Customers.customer_id;

이 연습 문제를 풀어보면, 기본 키와 외래 키의 설정 방법과 관계를 실제로 확인할 수 있습니다.

마무리

SQL에서 기본 키와 외래 키는 데이터베이스 설계에서 없어서는 안 될 요소입니다. 기본 키는 각 레코드를 고유하게 식별하고, 외래 키는 테이블 간의 관계를 구축합니다. 이러한 키를 올바르게 설정함으로써 데이터의 무결성을 유지하면서 효율적인 데이터 관리를 할 수 있습니다. 본 기사를 통해 기본 키와 외래 키의 정의, 역할 및 설정 방법을 이해하고 실제 데이터베이스 설계에 활용하시기 바랍니다.

목차