ERROR 1055 (42000): incompatible with sql_mode=only_full_group_by

Creating the dots·2022년 1월 3일
0

SQL

목록 보기
11/21

Udemy 9강을 실습하며 위와 다음과 같은 에러가 발생했다.

ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'section9.books.title' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

원인

GROUP BY를 B라는 기준으로 하고, SELECT 하는 필드들이 A,B,C 등 B가 아닌 것들을 조회하려고 할때 발생한다.

MySQL에는 테이블의 무결성을 보호하고, 정확하고 일관된 결과를 만들기 위해 sql_mode를 사용하는데, 그 중 하나가 only_full_group_by이다. 이 모드를 사용하는 목적은 SELECT 쿼리가 GROUP BY 절과 사용됐을때, 의미있는 결과를 생성하는 것을 보장하기 위함이다.

강사가 사용한 MySQL 버전(5.5)에서는 이 모드가 기본값 설정이 아니었으나 5.7 이상의 버전에서는 이 모드가 기본값으로 설정되어 위와 같은 에러가 발생한다.

해결방법

  • 모든 sql 모드를 비활성화하기 (비추천)
    mysql> SET @@sql_mode='';

  • 현재 sql 모드의 session variable을 다른 local variable에 저장해두어 필요한 쿼리문을 모두 실행한 후 기존의 모드가 필요할때 저장한 변수를 가져와 복구시킨다. (비추천)
    mysql> SET @old_sql_mode=@@sql_mode;
    mysql> SET @@sql_mode='';
    mysql> SET @@sql_mode=@old_sql_mode;


위의 두 방법은 쿼리문을 실행할때 only_full_groupt_by 뿐만 아니라 필요할 수 있는 모든 sql 모드를 비활성화시키기 때문에 추천하지 않고, 다음 방법이 가장 적절한 해결방안이다.

  • 두 번째 방법과 마찬가지로 현재 sql 모드를 local variable에 저장해두고, 현재 sql 모드에서 only_full_group_by 변수만 제거한다. 필요한 쿼리문을 모두 실행한 후 기존의 모드가 필요할때, 저장한 변수를 가져와 복구시킨다.
    mysql> SET @old_sql_mode=@@sql_mode;
    mysql> SET @@sql_mode = REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY,', '');
    mysql> SET @@sql_mode = @old_sql_mode;
profile
어제보다 나은 오늘을 만드는 중

0개의 댓글