본문 바로가기
IT/Database

[Mysql] sql_mode=only_full_group_by

by 성준하이 2024. 4. 18.
반응형

Mysql 을 사용중인데 아래와 같은 에러가 발생했다.

 

this is incompatible with sql_mode=only_full_group_by

 

찾던 중에 mysql 공식 홈페이지에서 이와 같은 글을 발견했다.

https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html

 

MySQL :: MySQL 5.7 Reference Manual :: 12.19.3 MySQL Handling of GROUP BY

12.19.3 MySQL Handling of GROUP BY SQL-92 and earlier does not permit queries for which the select list, HAVING condition, or ORDER BY list refer to nonaggregated columns that are not named in the GROUP BY clause. For example, this query is illegal in sta

dev.mysql.com

 

정리하면 5.7 Version에서는 sql_mode 항목이 생겼으며 그 옵션 안에 only_full_group_by 내용이 존재함에 따라 발생되는 부분이라고 설명되어 있다. 

 

해결법
쿼리 수정

 

SELECT ID,NAME,MAX(AGE) FROM TEST GROUP BY ID;

이 쿼리는 에러가 나는 쿼리이고

 

Name의 값을 groupby 에서 정할수 있도록 집계함수 등을 추가해주면 된다.

 

sql_mode 변경

 

SELECT @@sql_mode; 

로 현재 sql_mode를 확인하고,

 

@@sql_mode
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

이렇게 결과가 나오는데 ONLY_FULL_GROUP_BY 값이 들어가있어서 에러가 발생한다.

 

지워주면 된다.

  • 현재 세션에서만 지우기

SET SESSION sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'

위에 출력에서 지운 텍스트로 set 해준다.

  • 전체 지우기

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

로 값을 추가해주면 된다.

반응형

댓글