customers
테이블을 조회한 결과.
여기서 customer_id
는 orders
테이블에서 가져온 외래키다.
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_id
를 Null
or deleted
or unknown
등의 값으로 업데이트한다.
2. George
가 주문한 내역 모두를 같이 지워버린다.
이외의 방법으로 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
);
customers
의 id
를 참조하는 외래키가 있는데, 만약 해당 id
를 가진 고객이 customers
테이블에서 삭제되면, orders
테이블에서 해당 customer_id
를 가진 행을 모두 삭제한다.
➡️ 즉, customers
테이블에서 id
가 참조된 외래키가 삭제되면, orders
테이블에서도 해당 id
를 가진 행을 삭제.
탈퇴한 회원의 주문 내역을 유지하지 않아도 된다면,
MySQL에 외래키 제약조건을 설정하고 ON DELETE CASCADE
옵션으로 탈퇴회원의 주문 내역을 모두 삭제할 수 있다.
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
를 사용하는 것이 더 효율적이다.