TIL

24.10.11 TIL

skyteer0 2024. 10. 11. 21:09

외래 키 (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