programing

모드별 _full_group_only의 이점은 무엇입니까?

bestprogram 2023. 10. 29. 19:54

모드별 _full_group_only의 이점은 무엇입니까?

mysql을 업데이트하고 MySQL 버전 5.6.17에서 버전 5.7.14로 변경했습니다.

sql 쿼리에 오류가 있기 때문에

실제로 많은 쿼리가 다음과 같습니다.

SELECT count (id) as nbr, lic from prep WHERE key = '18'

그리고 제게 이런 오류가 있습니다.

1140 - GROUP BY가 없는 집계 쿼리에서 SELECT 목록의 식 #2에 집계되지 않은 열 'operator.preparation.orig_lic'이 포함되어 있습니다. 이는 sql_mode=only_full_group_by와 호환되지 않습니다.

몇 가지 조사 끝에 Mysql 5.7.14가 기본적으로 ONLY_FULL_GROUP_BY를 활성화한다는 것을 알게 되었습니다.

기본적으로 활성화된 이유는 무엇입니까?

(성능을 위한) 최선의 해결책은 무엇입니까?쿼리에서 ONLY_FULL_GROUP_BY를 비활성화하시겠습니까? 아니면 'group by'를 추가하시겠습니까?

감사해요.

only_full_group_by = 는 MySQL 엔진에 대해 다음과 같이 말합니다.적용하지않음GROUP BY어떤 결과를 보여줄지 의문이 들 때, 그리고 오류를 던질 것입니다.경우에만 적용합니다.Group By구체적으로 당신에게 무엇을 해야 하는지 알려줍니다. 즉, 언제.Group By꽉 차 있고 완벽합니다!

only_full_group_by = off가 MySQL 엔진에 알립니다: 항상 적용GROUP BY그리고 어떤 결과를 선택해야 할지 궁금하다면, 그냥 무작위로 하나를 고르세요!

사용하시면 끌 필요가 없습니다.GROUP BY제대로!

예:

표: 사용자

 id   |  name
----------------
  1      ali
  2      john
  3      ali

사용할때GROUP BY에서name열:

SELECT * FROM users GROUP BY name;

두 가지 가능한 결과가 있습니다.

  1      ali
  2      john     

오어

  2      john
  3      ali

MYSQL은 어떤 결과를 선택해야 할지 모릅니다!서로 다르기 때문에ids 하지만 둘 다 가지고 있습니다name=ali.

해결책 1:

선택만.name필드:

SELECT name FROM users GROUP BY name;

결과:

  ali
  john     

이것은 완벽한 해결책입니다.다음을 수행하는 열 제거GROUP BY혼란스러운.이것은 당신이 무엇을 하고 있는지를 알고 있다는 뜻입니다.보통 당신은 필요하지 않습니다.
필요한 경우 솔루션 3으로 이동하십시오!

해결책 2:

끄기only_full_group_by. MYSQL은 두 가지 가능한 결과 중 하나를 무작위로 선택할 것입니다!! (당신이 정말로 무엇을 신경쓰지 않아도 괜찮습니다.id를 선택하지만 쿼리 후 즉시 전원을 켜서 향후 그룹에서 예기치 않은 동작을 방지해야 합니다.

해결책3

사용.Aggregate와 같은 기능을 하는MIN(),MAX()MYSQL이 무엇을 선택해야 하는지 결정할 수 있도록 도와줍니다.

예를 들어,

SELECT MAX(id), name FROM users GROUP BY name;

결과:

  2      john     
  3      ali

그것은 선택할 것입니다.ali최대를 가지는 행id.

"최상의" 해결책은 올바른 작업을 수행하고 다음을 추가하여 쿼리를 수정하는 것입니다.group by, 오류를 무시하는 것이 아닙니다.다음과 같은 오류를 재정의할 경우ONLY_FULL_GROUP_BY현재 발생하고 있는 오류는 사라지지만 이로 인해 두 가지 새로운 오류가 발생할 가능성이 높습니다.

  1. 집계되지 않은 값에 집계된 값을 포함하는 예기치 않은 결과, 오류를 방지하려고 하는 문제입니다.

  2. 다른 환경에서 쿼리를 실행할 수 없습니다.이 데이터베이스를 사용하지 않는 다른 사용자에게 설정을 전환하거나 코드를 전달해야 하는 경우 쿼리에서 오류가 다시 발생합니다.오류나 기타 오류를 무시하는 습관이 생기면 코드를 다른 사람이 사용할 수 없게 되고 코드의 유용성이 심각하게 손상될 수 있습니다.

일반적으로 오류가 발생하는 경우 컴파일러/옵티마이저에게 무시하라고 말할 것이 아니라 수정하십시오.

올바른 해결책은 다음을 기준으로 그룹화하는 열을 추가하는 것입니다.

SELECT count (id) as nbr, lic 
from prep 
WHERE key = '18'
group by lic

이것은 당신이 가지고 있는 지수에 달려있습니다.

ONLY_FULL_GROUP_BY는 SQL에서 집계 함수에 대한 일반적인 동작이며 집계되지 않은 열 결과에 대한 일상적인 결과의 모호성을 방지하기 위해 5.7을 채택했습니다.

언급URL : https://stackoverflow.com/questions/45484068/what-are-the-benefits-of-only-full-group-by-mode