MySQL Cascade (외래키와 삭제), IF()

·2024년 4월 11일
0

MySQL

목록 보기
10/14
post-thumbnail

customers 테이블을 조회한 결과.
여기서 customer_idorders 테이블에서 가져온 외래키다.

DELETE FROM customers WHERE last_name = 'George';

만약 외래키가 적용되어있는 행을 지우려고 하면 아래의 에러가 뜨는 것을 볼 수 있다.

Cannot delete or update a parent row: a foreign key constraint fails (`shop`.`orders`, CONSTRAINT `orders_ibfk_1` FOREIGN KEY (`customer_id`) REFERENCES `customers` (`customer_id`))
외래키 제약 조건이 위반된다는 내용의 에러.

지우려면 아래와 같은 방법을 이용할 수 있을 것 같다.
1. customer_idNull or deleted or unknown등의 값으로 업데이트한다.
2. George가 주문한 내역 모두를 같이 지워버린다.

이외의 방법으로 Cascade를 사용하는 방법이 있다.

Cascade

단어 : 종속이라는 의미를 가짐.

CREATE TABLE orders(
    orders_id INT AUTO_INCREMENT PRIMARY KEY,
    order_date DATE,
    amount FLOAT NOT NULL,
    customer_id INT,
    FOREIGN KEY(customer_id) REFERENCES customers(customer_id) ON DELETE CASECADE 
);

customersid를 참조하는 외래키가 있는데, 만약 해당 id를 가진 고객이 customers테이블에서 삭제되면, orders 테이블에서 해당 customer_id를 가진 행을 모두 삭제한다.

➡️ 즉, customers테이블에서 id가 참조된 외래키가 삭제되면, orders 테이블에서도 해당 id를 가진 행을 삭제.

탈퇴한 회원의 주문 내역을 유지하지 않아도 된다면,
MySQL에 외래키 제약조건을 설정하고 ON DELETE CASCADE 옵션으로 탈퇴회원의 주문 내역을 모두 삭제할 수 있다.

쿼리 IF문

if(조건, 참일 때 표현값, 거짓일 때 표현값)

SELECT first_name, last_name, COUNT(rating) AS 'review_count', IFNULL(MIN(rating), 0) AS 'MIN', IFNULL(MAX(rating), 0) AS 'MAX', IFNULL(AVG(rating), 0) as 'AVG', 
IF(COUNT(rating), 'ACTIVE', 'INACTIVE') AS status
FROM reviewers
LEFT JOIN reviews
ON reviewers.id = reviews.reviewer_id
GROUP BY first_name, last_name;

조건이 여러개일때는 CASE를 사용하지만, 조건 기준이 딱 두 개로 나누어 평가 가능하다면 IF를 사용하는 것이 더 효율적이다.

profile
- 배움에는 끝이 없다.

0개의 댓글