web-dev-qa-db-fra.com

Code d'erreur: 1055 incompatible avec sql_mode = only_full_group_by

J'ai eu des problèmes pour passer à une version hors ligne de la base de données de baseball Lahman SQL. J'utilisais un terminal intégré dans un cours EDX. Cette commande fonctionne correctement sur le terminal Web:

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;

Qui exécute SQL 5.5.46, mais lorsque j'utilise ma version hors ligne exécutant 5.7.10, j'obtiens le code d'erreur suivant:

Code d'erreur: 1055. L'expression n ° 1 de la liste SELECT n'est pas dans la clause GROUP BY et contient la colonne non agrégée 'stats.m.nameFirst' qui ne dépend pas fonctionnellement des colonnes de la clause GROUP BY; cela est incompatible avec sql_mode = only_full_group_by

J'ai lu beaucoup de solutions aux problèmes des gens, mais ils n'ont pas aidé dans ce cas. Cela ne s'est jamais produit auparavant, donc je pense que c'est super évident ou peut-être que je commence à coder. Quoi qu'il en soit, quelqu'un sait comment résoudre ce problème?

16
Frydaddy07

Dans 5.7, le sqlmode est défini par défaut sur:

 ONLY_FULL_GROUP_BY,NO_AUTO_CREATE_USER,STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION

Pour supprimer la clause ONLY_FULL_GROUP_BY, vous pouvez procéder comme suit:

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

Cela supposait que vous deviez faire ce GROUP BY avec des colonnes non agrégées.

Cordialement

43
White Feather

La solution acceptée ci-dessus ne fonctionnait pas pour moi sur la version 5.7.9, for osx10.9 (x86_64).

Ensuite, ce qui suit a fonctionné -

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';
25
Anis

Pour les autres cas d'utilisation: vous n'avez pas nécessairement à désactiver ONLY_FULL_GROUP_BY Dans un cas comme celui-ci, selon les documents mysql, "Cette requête n'est pas valide si le nom n'est pas une clé primaire de t ou une colonne NOT NULL unique . Dans ce cas, aucune dépendance fonctionnelle ne peut être déduite et une erreur se produit: "

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

À la place, vous pouvez utiliser cette ANY_VALUE('my_column_name') my_column_name Citant les documents mysql, "Dans ce cas, MySQL ignore le non-déterminisme des valeurs d'adresse dans chaque groupe de noms et accepte la requête." Utilisez ANY_VALUE () pour faire référence à l'adresse:

SELECT name, ANY_VALUE(address), MAX(age) FROM t GROUP BY name;
6
phil