반응형
로컬 환경에서 MySQL 로 GROUP BY 를 하려고 하면 아래 에러가 발생하였다.
select
department_id, admission_year, count(1) as cnt
from student_table
group by department_id, admission_year
;
Expression
#1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'department_id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
쿼리만 본다면 잘못된 쿼리는 아닌 정상적인데 조회가 되지 않았다.
구글링을 해보니 MySQL 5.7 버전부터 sql_mode 라는 것이 생기게 되었고, 그중 only_full_group_by 가 선언되어 있어 발생한 문제였다.
1. 원인
- MySQL 이 5.7 버전으로 업그레이드 또는 설치를 하게 되면서 이전에는 없던 sql_mode 라는 기능으로 인해 기본적으로 설정되는 only_full_group_by 가 선언이 되면서 쿼리가 실패하였다.
- 해당 내용은 아래 공식 사이트를 통해서도 확인할 수 있다.
2. 해결 방법
- 기본적으로 로컬 환경의 MySQL 의 sql_mode 를 조회한다.
# sql_mode 확인 Query
SELECT @@sql_mode;
2-1. 현재 연결된 Session(세션) 제거
- 간단하게는 쿼리를 수행시켜 sql_mode 항목을 변경하여 only_full_group_by 를 제거한다.
# 현재 연결된 Session 설정
set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
# 전체 설정
set global sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
2-2. 영구적 제거
- MySQL 서버를 시작/재시작 할 때마다 제거하기 위해서는 설정 파일(my.cnf)을 수정하여 재기동한다.
# 영구적 제거(파일 위치는 설치 위치에 따라 다를 수 있습니다.)
$ vi /etc/my.cnf
# 아래 내용 추가
...
[mysqld]
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
...
참고
- https://velog.io/@heumheum2/ONLYFULLGROUPBY
- https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html
반응형
'Error' 카테고리의 다른 글
[ERROR] npm 설치 시 SELF_SIGNED_CERT_IN_CHAIN 에러 (0) | 2024.07.09 |
---|---|
[ERROR] Java에서 크롤링 Selenium(셀레니움) 사용 시 Unable to establish websocket connection to 에러 해결 (0) | 2023.04.18 |
[ERROR] IndexOutOfBoundsException(With. MyBatis) (0) | 2022.12.03 |
[ERROR] Could not resolve all files for configuration ':classpath'. 에러 해결(With. Gradle Build) (0) | 2022.11.26 |
[Error] java.lang.ClassCastException 해결법 (1) | 2022.10.04 |