MySQL에서 5일이 지난 모든 행 삭제하기
MySQL에서 특정 날짜 기준으로 5일이 지난 오래된 데이터를 일괄 삭제하려면 DELETE 문과 DATEDIFF() 함수를 함께 사용하면 됩니다. DATEDIFF() 함수는 두 날짜 사이의 일수 차이를 계산해 주기 때문에, 현재 시점과 저장된 날짜 컬럼 값을 비교하는 조건으로 활용할 수 있습니다.
기본 문법
delete from yourTableName
where datediff(now(), yourTableName.yourDateColumnName) > 5;
위 쿼리는 현재 날짜(now())와 테이블의 날짜 컬럼 사이의 차이가 5일보다 큰 모든 행을 삭제합니다.
참고 − 이 예제에서는 현재 날짜를 2019-03-10이라고 가정하고 설명합니다.
예제 테이블 생성하기
개념을 이해하기 위해 먼저 실습용 테이블을 만들어 보겠습니다. 아래 쿼리로 테이블을 생성합니다.
mysql> create table deleteRowsOlderThan5Demo
-> (
-> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> Name varchar(100),
-> Post_Date date
-> );
Query OK, 0 rows affected (0.69 sec)
샘플 데이터 삽입
INSERT 명령어를 사용해 몇 개의 레코드를 추가합니다.
mysql> insert into deleteRowsOlderThan5Demo(Name,Post_Date) values('Larry','2019-03-11');
Query OK, 1 row affected (0.12 sec)
mysql> insert into deleteRowsOlderThan5Demo(Name,Post_Date) values('Mike','2019-02-12');
Query OK, 1 row affected (0.17 sec)
mysql> insert into deleteRowsOlderThan5Demo(Name,Post_Date) values('Sam','2019-03-10');
Query OK, 1 row affected (0.12 sec)
mysql> insert into deleteRowsOlderThan5Demo(Name,Post_Date) values('Carol','2019-03-01');
Query OK, 1 row affected (0.23 sec)
mysql> insert into deleteRowsOlderThan5Demo(Name,Post_Date) values('David','2019-01-31');
Query OK, 1 row affected (0.19 sec)
mysql> insert into deleteRowsOlderThan5Demo(Name,Post_Date) values('Maxwell','2019-01-26');
Query OK, 1 row affected (0.10 sec)
mysql> insert into deleteRowsOlderThan5Demo(Name,Post_Date) values('John','2019-02-19');
Query OK, 1 row affected (0.12 sec)전체 데이터 조회
SELECT 문으로 테이블에 저장된 모든 레코드를 확인해 보겠습니다.
mysql> select *from deleteRowsOlderThan5Demo;
실행 결과는 다음과 같습니다.
+----+---------+------------+
| Id | Name | Post_Date |
+----+---------+------------+
| 1 | Larry | 2019-03-11 |
| 2 | Mike | 2019-02-12 |
| 3 | Sam | 2019-03-10 |
| 4 | Carol | 2019-03-01 |
| 5 | David | 2019-01-31 |
| 6 | Maxwell | 2019-01-26 |
| 7 | John | 2019-02-19 |
+----+---------+------------+
7 rows in set (0.00 sec)
5일이 지난 행 삭제 실행
이제 DATEDIFF() 함수를 사용해 5일이 지난 모든 행을 삭제하는 쿼리를 실행합니다.
mysql> delete from deleteRowsOlderThan5Demo
-> where datediff(now(), deleteRowsOlderThan5Demo.Post_Date) > 5;
Query OK, 5 rows affected (0.14 sec)
현재 날짜가 2019-03-10이므로, Post_Date가 2019-03-05보다 이전인 5개의 행(Mike, Carol, David, Maxwell, John)이 삭제되었습니다.
삭제 후 결과 확인
테이블의 레코드를 다시 한번 조회하여 삭제가 정상적으로 적용되었는지 확인합니다.
mysql> select *from deleteRowsOlderThan5Demo;
실행 결과는 다음과 같습니다.
+----+-------+------------+
| Id | Name | Post_Date |
+----+-------+------------+
| 1 | Larry | 2019-03-11 |
| 3 | Sam | 2019-03-10 |
+----+-------+------------+
2 rows in set (0.00 sec)
결과를 보면 최근 5일 이내에 작성된 Larry(2019-03-11)와 Sam(2019-03-10)의 데이터만 남아 있는 것을 확인할 수 있습니다.
추가 팁: INTERVAL을 활용한 대안 방법
DATEDIFF() 외에도 DATE_SUB() 함수와 INTERVAL을 조합하면 같은 결과를 얻을 수 있습니다.
delete from yourTableName
where yourDateColumnName < date_sub(now(), interval 5 day);
이 방식은 날짜 컬럼에 인덱스가 설정되어 있을 경우 인덱스를 활용할 수 있어 대량의 데이터를 다룰 때 더 나은 성능을 기대할 수 있습니다.