외래 키 (Foreign Key)에 대해서 더 알아보자
외래 키의 경우 다른 테이블과 관계를 맺고 있는 참조 데이터가 삭제(DELETE)또는 수정(UPDATE)될 떄 어떤 행위를 해야하는지 설정할 수 있다. 이런 행위를 연계 참조 무결성 제약 조건이라 한다.
1.CASCADE
- 참조하고 있는 개체가 변경/삭제 될 경우 함꼐 변경/삭제 됩니다.
- ex) 사용자가 삭제된다면 그 사용자의 모든 주문 내역도 삭제된다.
FOREIGN KEY (userId) REFERENCES Users(userId)
ON DELETE CASCADE
ON UPDATE CASCADE;
2. NO ACTION
- 참조하고 있는 개체가 변경/삭제 될 경우 아무런 행위를 하지 않고 에러가 발생하게 된다.
- ex) 사용자를 삭제할 때 사용자의 주문 내역이 아직 존재한다면 삭제를 막는다.
FOREIGN KEY (userId) REFERENCES Users(userId)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
3. SET NULL
- 참조하고있는 개체가 변경/삭제 될 경우 현재 데이터를 NULL로 변경한다.
- ex) 사용자가 삭제되면 사용자의 주문 내역의 사용자 ID는 NULL로 변경된다.
FOREIGN KEY (userId) REFERENCES Users(userId)
ON DELETE SET NULL
ON UPDATE SET NULL;
4. SET DEFAULT
- 참조하고 있는 개체가 변경/삭제 될 경우 현재 데이터를 기본 값으로 변경한다.
- ex) 사용자가 삭제되면 사용자의 주문 내역의 사용자 ID는 기본 값으로 변경된다.
FOREIGN KEY (userId) REFERENCES Users(userId)
ON DELETE SET DEFAULT
ON UPDATE SET DEFAULT;
SELECT JOIN연산자
JOIN 연산자는 두 테이블 사이의 공통된 데이터를 기준으로 테이블을 연결하여 하나의 테이블처럼 조회 할 수 있게 해주는 연산자이다.
JOIN 연산자는 SQL의 제약 조건은 아니지만 여러 테이블 간의 외래 키로 설정된 컬럼들을 연결하여 조회하는 SELECT 연산자의 활용법 중 하나이다.
CREATE TABLE Users
(
userId int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
email varchar(255) NOT NULL,
password varchar(255) NOT NULL
);
CREATE TABLE Posts
(
postId int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
userId int(11) NOT NULL,
title varchar(255) NOT NULL,
content varchar(255) NOT NULL,
FOREIGN KEY (userId) REFERENCES Users (userId)
);
INSERT INTO Users (userId, email, password)
VALUES (1, 'AAAA', '1234'),
(2, 'BBBB', '1234');
INSERT INTO Posts (userId, title, content)
VALUES (1, 'AAAA Title1', 'content'),
(1, 'AAAA Title2', 'content'),
(2, 'BBBB Title1', 'content'),
(2, 'BBBB Title2', 'content');
위에 구문 처럼 게시글 목록을 조회할 때 삭정한 사용자의 이메일을 표시하고 싶더라도 게시글 테이블에는 email 컬럼이 존재하지 않기 때문에 이메일을 표시해줄 수가 없다.
하지만 게시글 테이블에서는 userId 컬럼을 이용해 어떤 사용자가 게시글을 작성했는지 확인할 수 있으므로 JOIN을 이용해 외래키가 설정된 userId를기준으로 해당 사용자의 이메일을 함꼐 출력하도록설정할 수 있습니다.
SELECT p.postId, p.title, p.content, u.email
FROM Posts as p
JOIN Users as u
ON p.userId = u.userId;
'TIL' 카테고리의 다른 글
| 24.10.10 TIL (0) | 2024.10.10 |
|---|---|
| 24.10.01 TIL (1) | 2024.10.01 |
| 24.09.25 TIL (3) | 2024.09.25 |
| 24.09.24 TIL (1) | 2024.09.24 |
| 24.09.23 TIL (0) | 2024.09.23 |