외래키는 한 테이블의 열이 다른 테이블의 기본 키(primary key)나 후보 키(candidate key)의 값을 참조하는 데 사용하는 제약 조건입니다. 즉 외래키는 데이터 무결성과 관계의 일관성을 유지하는 데 중요한 역할을 합니다.
데이터 무결성(Data Integrity)을 지키기 위해서는 데이터 무결성 제약조건에 대해 알고 있어야 합니다. 무결성 제약조건이란 데이터베이스의 정확성, 일관성을 보장하기 위해 저장, 삭제, 수정 등을 제약하기 위한 조건을 뜻합니다.
PostgreSql에서는 다양한 방법으로 데이터 무결성을 제어할 수 있으며, 일반적으로 사용되는 제약조건 중에 외래 키(FOREIGN KEY) 제약 조건 이 있습니다.
외래 키 (Foreign Keys)
두 테이블 사이의 관계를 선언함으로써, 데이터의 무결성을 보장해 주는 역할을 하며, 외래 키 관계를 설정하게 되면 외래 키 테이블이 다른 테이블에 의존하게 됩니다. 외래 키는 '기준 테이블'을 참조하기 때문에, 반드시 '기준 테이블'에 존재하는 데이터만 입력이 가능하며, 참조하는 '기준 테이블'의 컬럼은 반드시 PK이거나 Unique이어야 합니다. 외래키 제약 조건을 추가할 때 고려해야 할 몇 가지 중요한 점이 있는데, 아래와 같습니다.
- 참조 무결성 보장: 외래키 제약 조건은 참조 무결성을 유지하기 위해 사용됩니다. 이는 외래키 값이 참조하는 테이블의 기본 키 값과 일치해야 함을 의미하며, 이를 통해 데이터베이스에서 무효한 참조를 방지할 수 있습니다.
- 다양한 연산에 대한 제한: 외래키 제약 조건을 가진 열에는 삽입, 갱신, 삭제 연산에 제한이 있습니다. 예를 들어, 부모 테이블에서 삭제된 행을 참조하는 외래키가 있는 자식 테이블의 행을 삭제할 때 제한할 수 있습니다.
- 테이블 간의 관계 표현: 외래키 제약 조건은 테이블 간의 일대 다, 다대일, 다대다와 같은 관계를 표현하는 데 사용됩니다.
- JOIN 작업 간략화: 외래키를 기반으로 하는 JOIN 작업은 데이터베이스에서 매우 일반적이며, 이를 통해 효율적인 데이터 검색이 가능합니다.
외래키 제약 조건을 PostgreSQL에서 추가할 때는 FOREIGN KEY 키워드를 사용하여 외래키를 지정하고, 'REFERENCES' 키워드를 사용하여 참조되는 테이블과 열을 지정합니다.
CREATE TABLE users (
user_id SERIAL PRIMARY KEY,
username VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL UNIQUE,
password VARCHAR(100) NOT NULL
);
CREATE TABLE products (
product_id SERIAL PRIMARY KEY,
product_name VARCHAR(100) NOT NULL,
product_code VARCHAR(20) UNIQUE
);
CREATE TABLE orders (
order_id SERIAL PRIMARY KEY,
user_id INT NOT NULL,
product_id INT NOT NULL,
quantity INT NOT NULL,
FOREIGN KEY (user_id) REFERENCES users(user_id),
FOREIGN KEY (product_id) REFERENCES products(product_id)
);
위의 예시에서 'orders' 테이블의 'user_id'와 'product_id' 열은 각각 'users' 테이블과 'products' 테이블의 기본 키를 참조하는 외래 키입니다. 이러한 외래키 제약 조건을 통해 orders 테이블에 삽입되는 데이터의 무결성이 유지됩니다.
외래 키 연산(Foreign Key Calculation)
PostgreSQL에서 외래 키를 사용하는 테이블에 대한 연산을 수행할 때 몇 가지 주의할 점이 있습니다.
- 데이터 일관성 유지: 외래 키를 사용하는 테이블에 대한 삽입, 갱신, 삭제 작업을 수행할 때에는 데이터 일관성을 유지해야 합니다. 즉, 외래키 제약 조건을 위반하지 않도록 해야 합니다.
- DELETE 및 UPDATE 작업: 외래키를 참조하는 행이 있는 경우, 부모 테이블에서 DELETE 또는 UPDATE 작업을 수행할 때 주의해야 합니다. 보통은 참조 무결성을 유지하기 위해 부모 테이블의 변경이 허용되지 않습니다. 이를 위해 관련된 자식 행에 대한 조치가 필요합니다.
-- 부모 테이블에서 행을 삭제할 때 CASCADE 옵션 사용
DELETE FROM users WHERE user_id = 123 CASCADE;
-- 부모 테이블에서 행을 갱신할 때 CASCADE 옵션 사용
UPDATE users SET user_id = 456 WHERE user_id = 123 CASCADE;
-- 자식 테이블에서 행을 삭제하거나 갱신할 때 부모 테이블의 변경에 대한 조치
DELETE FROM orders WHERE user_id = 123;
UPDATE orders SET user_id = 456 WHERE user_id = 123;
사용자 테이블에서 행을 삭제하거나 갱신할 때 CASCADE 옵션을 사용하여 연관된 주문 테이블의 행도 함께 삭제하거나 갱신하는 방법을 사용합니다. 또한 자식 테이블에서는 부모 테이블의 변경에 대한 조치를 수행하는 것도 가능합니다.
'RDMS > PostgreSQL' 카테고리의 다른 글
[PostgreSQL] 해시 인덱스(Hash Index)에 대해서 - 컴도리돌이 (0) | 2024.08.28 |
---|---|
[PostgreSQL] B-tree index에 대해서 - 컴도리돌이 (2) | 2024.03.28 |
[PostgreSQL] 인덱스 온리 스캔(index only scan)에 대해서 - 컴도리돌이 (1) | 2024.03.27 |
[PostgreSQL] 날짜 형식 검증 함수 - 컴도리돌이 (0) | 2024.01.18 |
[PostgreSQL] NLP 자연어 기반 구문 검색[Full-Text Search] - 컴도리돌이 (0) | 2024.01.17 |