programing

오류 코드: 1055가 sql_mode=only_full_group_by와 호환되지 않음

stoneblock 2023. 10. 26. 20:35

오류 코드: 1055가 sql_mode=only_full_group_by와 호환되지 않음

라만 SQL 야구 데이터베이스의 오프라인 버전으로 전환하는 데 문제가 있었습니다.EDX 과정에 단말기를 내장하고 있었습니다.이 명령은 웹 터미널에서 정상적으로 실행됩니다.

SELECT concat(m.nameFirst,concat(" ",m.nameLast)) as Player,
    p.IPOuts/3 as IP,
    p.W,p.L,p.H,p.BB,p.ER,p.SV,p.SO as K,
    p.IPOuts+p.W*5+p.SV+p.SO-p.BB-p.L-p.H as PTS,
    p.yearID as Year
FROM Pitching p
Inner Join Master m
    ON p.playerID=m.playerID
WHERE p.yearID=2014 AND p.IPOuts>=50
GROUP BY m.playerID
ORDER BY PTS DESC;

SQL 5.5.46을 실행하고 있지만 5.7.10을 실행하는 오프라인 버전을 사용하면 다음 오류 코드가 표시됩니다.

오류 코드: 1055.SELECT 목록의 식 #1이 GROUP BY 절에 없으며 GROUP BY 절의 열에 기능적으로 종속되지 않는 비집계 열 'stats.m.nameFirst'를 포함합니다. 이는 sql_mode=only_full_group_by와 호환되지 않습니다.

저는 사람들의 문제에 대한 해결책을 많이 읽어보았지만, 이 경우에는 도움이 되지 않았습니다.그런 일은 한 번도 없었기 때문에 이것은 아주 명백한 것이거나 아니면 코딩을 잘하고 있는 것 같습니다.어쨌든, 이걸 어떻게 고치는지 아는 사람?

5.7에서 sql 모드는 기본적으로 다음과 같이 설정됩니다.

 ONLY_FULL_GROUP_BY,NO_AUTO_CREATE_USER,STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION

ONLY_FULL_GROUP_BY 절을 제거하려면 다음 작업을 수행할 수 있습니다.

SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

집계되지 않은 열을 사용하여 해당 GROUP BY를 만들어야 합니다.

안부 전해요

위에서 수락한 솔루션이 버전에서는 작동하지 않았습니다.5.7.9, for osx10.9 (x86_64).

그 다음은 효과가 있었습니다.

set global sql_mode = '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이와 같은 경우를 고려할 때, mysql 문서에 따르면 "이 쿼리는 name이 t의 기본 키 또는 고유 NOT NULL 열이 아닌 경우 유효하지 않습니다.이 경우 함수 의존성을 추론할 수 없고 오류가 발생합니다."

SELECT name, address, MAX(age) FROM t GROUP BY name;
ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUP
BY clause and contains nonaggregated column 'mydb.t.address' which
is not functionally dependent on columns in GROUP BY clause; this
is incompatible with sql_mode=only_full_group_by

대신에 이것을 사용할 수 있습니다.ANY_VALUE('my_column_name') my_column_namemysql 문서를 인용하여 "이 경우 MySQL은 각 이름 그룹 내의 주소 값의 비결정성을 무시하고 쿼리를 받아들입니다."ANY_VALUE()를 사용하여 주소를 참조하십시오.

SELECT name, ANY_VALUE(address), MAX(age) FROM t GROUP BY name;
SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

** your query **

그러면 문제가 해결됩니다.

mysql 버전 8.0.26을 사용합니다.저는 많은 해결책을 시도했지만 아무 효과가 없습니다.Full groupBy mode change Engine_substitution을 변경했습니다.드디어 해봤습니다.

mysql -u root -p -e "SET GLOBAL sql_mode = 'NO_ENGINE_SUBSTITUTION';"

이것은 나에게 효과가 있었습니다.

선택한 답을 그대로 하면 @sql_mode는 다음과 같습니다.

',STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'.

'STRICT_TRANS_TAB' 앞에 쉼표가 있습니다.LES의 끈.

실행만 하면 됩니다.

set @@sql_mode = 
'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

그건 효과가 있다.

또한 exp를 따라 해볼 수 있습니다.

SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY,','');

테스트를 안 해봤는데 잘 될 것 같네요.

mysql에서 변수를 설정할 수 있습니다.

mysql> set global sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
mysql> 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';

NO_AUTO_CREATE_USER는 mysql 8에서는 작동하지 않습니다.

만약 효과가 없다면 그냥 다음과 같이 하십시오.

mysql > set sql_mode = ''

최근 버전에서는 *.cnf 파일 변경이 불가능하다고 생각합니다.대신 mysql.service 파일을 변경할 수 있습니다.

/lib/systemd/system/mysql.service
ExecStart=/usr/sbin/mysqld --sql-mode=STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION

최근 버전에서는 잘 작동하지만 최선의 방법은 아닙니다. 다음과 같은 방법을 사용할 수 있습니다.

   SELECT name, max(address), MAX(age) FROM t GROUP BY name;

(Linux)에서 mysql client.cnf 파일 찾기

  • /etc/my.cnf.d/client.cnf

그 다음 추가

[mysqld] 
sql_mode = ""

다음을 사용하여 MySQL 서비스를 저장하고 다시 시작합니다.

sudo systemctl restart mysqld

그런 다음 MySQL 서비스가 오류 없이 실행되고 있는지 확인합니다.

sudo systemctl status mysqld

이것이 오류없이 실행되고 있다면, 그것은 당신의 오류를 고칠 것입니다.

우리가 이 문제를 해결할 수 있는 몇 가지 방법이 있습니다.아래는 이 문제를 해결하기 위한 6가지 옵션입니다.

오류의 예 먼저 오류를 생성하는 코드의 예는 다음과 같습니다.

지역, 이름, SUM(인구) FROM City WHERE Country Code = 'AUS' 지역별 그룹 선택; 결과:

오류 1055(42000):SELECT 목록의 식 #2가 GROUP BY 절 및 c에 없습니다.

여기서 #2는 우리의 SELECT 목록의 두번째 표현식이 문제를 일으킨다는 것을 의미합니다.저희 같은 경우는 이름란입니다.저희 SELECT 목록에는 Name 컬럼이 포함되어 있지만 GROUP BY 조항은 포함되어 있지 않습니다.

해결책 1 이 문제를 해결하는 또 다른 방법은 이름 열을 GROUP BY 조항에 포함하는 것입니다.

지역, 이름, SUM(인구) FROM City WHERE Country Code = 'AUS' GROUP by District, Name;

결과:

+-----------------+---------------+-----------------+ | 지역 | 이름 | SUM(인구) | +------------------------------------------------------------------+ | 뉴사우스웨일스 | 시드니 | 3276207 || 빅토리아 | 멜버른 | 2865329 || 퀸즐랜드 | 브리즈번 | 1291117 || 웨스트오스트레일리아 | 퍼스 | 1096829 || 사우스오스트레일리아 | 애들레이드 | 978100 || 수도권| 캔버라 | 322723 | | 퀸즈랜드 | 골드코스트 | 311932 | | 뉴사우스웨일스 | 뉴캐슬 | 270324 | | | 뉴사우스웨일스 | 센트럴코스트 | 227657 | | 뉴사우스웨일스 | 울롱공 | 219761 | | | 태즈메이니아 | 호바트 | 126118 | | | 빅토리아 | 질롱 | 125382 | | 퀸즈랜드 | 타운즈빌 | 109914 | | | 퀸즈랜드 | 케언스 | 92273 |

솔루션 2 이 오류를 해결하는 또 다른 방법은 ANY_VALUE() 함수입니다.

District, ANY_VALUE(이름), SUM(인구) FROM City WHERE Country Code = 'AUS' GROUP by District; 결과:

+-----------------+-----------------+-----------------+ | 구 | ANY_VALUE(이름) | SUM(인구) | +--------------------------------------------------------------+ | 뉴사우스웨일스 | 시드니 | 3993949 | | | 빅토리아 | 멜버른 | 2990711 | | | 퀸즐랜드 | 브리즈번 | 1805236 | | | 웨스트오스트레일리아 | 퍼스 | 1096829 || 사우스오스트레일리아 | 애들레이드 | 978100 ||수도 지역 | 캔버라 | 322723 | | | 태즈메이니아 | 호바트 | 126118 | +--------------------------------------------------------------------------------------------+ ANY_VALUE() 함수는 지정한 열에서 임의의 값을 선택합니다.이 경우 이름 열에서 임의의 값을 선택했고, 첫 번째 행에 시드니, 두 번째 행에 멜버른 등을 선택했습니다.앞의 예에서 볼 수 있듯이, 해당 열에는 각 구역에 대한 값 이상이 포함되어 있지만 MySQL은 단순히 하나의 값을 선택하여 표시했습니다.

솔루션 3 또 다른 옵션은 GROUP_CONCAT() 함수를 사용하는 것입니다.

구, GROUP_CONCAT(이름), SUM(인구) FROM City WHERE Country Code = 'AUS' GROUP By District;

솔루션 4 sql_mode에 ONLY_FULL_GROUP_BY만 포함된 경우에만 오류가 발생합니다.

다음과 같이 sql_mode를 확인할 수 있습니다.

SELECT @@sql_mode; 결과:

ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES,NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVION_BY_ZERO, NO_ENGINE_SUBITION 예상대로 ONLY_FULL_GROUP_BY가 활성화되어 오류가 발생했습니다.

다음과 같이 세션의 sql_mode에서 ONLY_FULL_GROUP_BY를 비활성화할 수 있습니다.

SET @@sql_mode = SYS.LIST_DROP(@@sql_mode, 'ONLY_FULL_GROUP_BY'); SELECT @@sql_mode; 결과:

STRICT_TRANS_TABLES,NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVION_BY_ZERO, NO_ENGINE_SUSTATION을 사용하여 SYS.LIST_DROP 시스템 기능으로 다른 항목에 영향을 주지 않고 목록에서 항목을 제거했습니다.ONLY_FULL_GROUP_BY가 더 이상 sql_mode가 아님을 알 수 있습니다.

이제 오류를 발생시킨 원래 쿼리를 실행해 보겠습니다.

지역, 이름, SUM(인구) FROM City WHERE Country Code = 'AUS' 지역별 그룹 선택; 결과:

+-----------------+-----------+-----------------+ | 지역 | 이름 | SUM(인구) | +------------------------------------------------------------------+ | 뉴사우스웨일스 | 시드니 | 3993949 | || 빅토리아 | 멜버른 | 2990711 || 퀸즐랜드 | 브리즈번 | 1805236 || 웨스트오스트레일리아 | 퍼스 | 1096829 || 사우스오스트레일리아 | 애들레이드 | 978100 || 수도권 | 캔버ra | 322723 | | 태즈메이니아 | 호바트 | 126118 | +-------------------------------------------------------------------------------------------------------------------------------

언급URL : https://stackoverflow.com/questions/36207042/error-code-1055-incompatible-with-sql-mode-only-full-group-by