Mysql8.0 ONLY_FULL_GROUP_BY et au-dessus, ainsi que d'autres causes d'erreur en détail sql_mode Solutions
![](https://cdn2.jianshu.io/assets/default_avatar/5-33d2da32c552b8be9a0548c7a4576607.jpg)
Aujourd'hui, nous parlons de la question à mysql8 ONLY_FULL_GROUP_BY, je crois que tout le monde dans le groupe en utilisant la fonction saute tout à coup d'un message d'erreur:
ERROR 1055 (42000): Expression n ° 7 de la liste SELECT se trouve pas dans la clause GROUP BY et contient colonne non agrégée « postscan.verifyDelayLog.auditor » qui ne dépend pas fonctionnellement sur des colonnes de la clause GROUP BY; ce qui est incompatible withsql_mode = ONLY_FULL_GROUP_BY
Dans la version mysql8.0 ci-dessus, pour ce groupe par des opérations globales, si la colonne dans la sélection, ne figure pas dans le groupe par, alors ce SQL n'est pas légitime, parce que la colonne est pas dans le groupe par article, donc pour ce mode de mise en place d'une base de données, lors de l'utilisation group by, nous devons utiliser MAX (), SUM (), ANT_VALUE () cette fonction globale, pour compléter le gROUPE de polymérisation par opération, de sorte que cela dit, la façon de désactiver il?
Après nous avons quelques Baidu, le résultat obtenu est d'environ ONLY_FULL_GROUP_BY, mais suivre le tutoriel a dit, il suffit de modifier le my.cnf,
【
Ajout suit my.cnf
[Mysqld]
sql_mode = 'NO_AUTO_VALUE_ON_ZERO, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION, PIPES_AS_CONCAT, ANSI_QUOTES'
】
Le fichier de configuration en ajoutant le paramètre approprié [ci-après sera désigné] pour redémarrer le temps, il est encore loin d'être satisfaisante, même des gens qui n'ont pas donné des tutoriels pour les mains sur le test, pour mettre, mais aussi apporter une nouvelle erreur de MySQL, ou complètement commencer à être donné, aujourd'hui, je viens à vous avec une par une description détaillée de ces paramètres, et des solutions.
sql_mode variable, il est facilement négligé, la valeur par défaut est une valeur nulle, dans cette disposition est de permettre à certaines opérations illégales, telles que des données permettant invalides est insérée. Cette valeur doit être réglée sur le mode strict dans un environnement de production, le développement, le test base de données de l'environnement doit être définie de sorte que le développement et les phases de test peuvent trouver le problème.
sql_mode valeurs communes sont les suivantes:
ONLY_FULL_GROUP_BY: Pour GROUP BY total, si une colonne dans le SELECT, ne figure pas dans GROUP BY, le SQL est pas légitime, parce que la colonne est pas dans la clause GROUP BY.
NO_AUTO_VALUE_ON_ZERO: La valeur est insérée à partir de l'impact de la colonne de croissance. Dans le réglage par défaut, l'insert 0 ou NULL au nom d'une valeur de croissance autoproduite. Si vous souhaitez insérer une valeur de 0, et que la colonne est auto-croissance, cette option est très pratique.
STRICT_TRANS_TABLES: Dans ce mode, si une valeur ne peut pas être insérée dans une table de transaction, interrompre l'opération en cours, qui ne se limite pas aux tables non transactionnelles
NO_ZERO_IN_DATE: en mode strict, la date et le mois de zéro ne sont pas autorisés
NO_ZERO_DATE: Définissez la valeur, base de données MySQL ne permet pas la date d'insertion nulle, insérer zéro dates jetteront une erreur au lieu d'un avertissement.
ERROR_FOR_DIVISION_BY_ZERO: INSERT ou UPDATE dans le processus, si les données sont à zéro, une erreur au lieu d'une mise en garde. Si ce mode est pas donné, puis revenez NULL lorsque les données MySQL zéro
GRANT interdit aux utilisateurs de créer un mot de passe vide: NO_AUTO_CREATE_USER
NO_ENGINE_SUBSTITUTION: Si vous avez besoin d'un moteur de stockage est désactivé ou non compilé, puis une erreur. Lorsque cette valeur est pas définie, le remplacement du moteur de stockage par défaut, et lance une exception
PIPES_AS_CONCAT: l'opérateur « || » pas considéré comme des chaînes de connexion ou l'opérateur, et que la base de données Oracle est le même, ainsi que des fonctions de mélange CONCAT chaîne similaire
ANSI_QUOTES: ANSI_QUOTES alors activé, ne peut pas être utilisé pour faire référence à une chaîne entre guillemets doubles, car il est interprété comme un identifiant
Description l'introduction est terminée, mais étant donnée à 8,0 dans un tel contexte, pour les raisons suivantes:
ERREUR 1231 (42000): Variable « sql_mode » ne peut pas être réglé sur la valeur de « NO_AUTO_CREATE_USER »
8.0 ci-dessus a été annulé mot-clé NO_AUTO_CREATE_USER, supprimer le mot-clé pour instruction SQL
Enfin, / etc / my.cnf fichier de configuration modifié: sql_mode = 'STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_ENGINE_SUBSTITUTION'
MySql redémarrer le service, vous avez terminé! ~
Ici, je donne les deux autres solutions:
La seconde approche sans modifier le fichier de configuration, modifier l'utilisation navicat
Entrez l'interface de ligne de commande
Entrée: SELECT de la GLOBAL.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
Ensuite, nous modifions sql_mode
ensemble GLOBAL sql_mode = 'STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_ENGINE_SUBSTITUTION';
Exécutez votre sql, groupe par peut être utilisé, mais cette méthode ne guérit pas, après le redémarrage de MySQL, ne peut toujours pas utiliser le groupe So, la première méthode est la plus efficace.
Une troisième approche sans modifier le fichier de configuration, de modifier l'utilisation navicat
Entrez l'interface de ligne de commande
Entrée: SELECT @@ sql_mode; Note: De cette façon, la session par défaut, est terminée: SELECT @@ SESSION.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
Ensuite, nous modifions sql_mode
输入: 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';
Et puis exécutez votre sql:
***** ***** mal ou rapporté ONLY_FULL_GROUP_BY
############## solution ###################
Avant de définir la requête de l'instruction sql_mode
ensemble 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';
Plus tard, la nouvelle requête (groupe comprend par) les déclarations ne sont pas réglées sql_mode ensemble jusqu'à ce que vous fermez cette connexion à ce jour
Ensuite, vous exécutez votre sql ne peut pas l'exécuter
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';
SELECT de la GLOBAL.sql_mode;
Explication de la façon 3:
1. En fait, quand on parle de la troisième méthode mentionnée SELECT de la sql_mode, en fait, ici la session par défaut, est terminée: SELECT @@ SESSION.sql_mode;
2.SESSION session vise ----> Ceci expliquerait la connexion jusqu'à la fermeture des
3. Pourquoi le jeu en ligne de commande sql_mode, puis créez une nouvelle requête ou inutile il?
4. En fait, vous tapez SELECT de la sql_mode dans la nouvelle requête, vous constaterez que vous définissez sur la ligne de commande et ne prend effet
5. Par conséquent, nous ne pouvons à nouveau à cet égard (session) de la nouvelle requête re-set sql_mode, après la connexion (cette session) ne sont plus nécessaires
6. Cette section explique la langue « ensemble avant l'instruction de votre requête sql_mode » Cette phrase
2 Description de la façon dont les deux méthodes d'approche 3
Table des matières 1. Les deux ensemble de méthodes sql_mode, comme redémarrera mysql sur mon déploiement de Linux alors que je retourne dans le fichier de configuration spécifié l'option sql-mode dans my.cnf mis en place à l'intérieur
2. Comparer cette phrase sur
3. moyens: après le redémarrage de MySQL sur le plateau linux, vous ne sont plus valables sur navicat, mais en fonction des paramètres de fichier de configuration spécifié, ce fichier est situé dans my.cnf
Note: Je vais maintenant la liste my.cnf pour votre référence
![](http://upload-images.jianshu.io/upload_images/7705787-832dd35deb15cf7f.png?imageMogr2/auto-orient/strip|imageView2/2/w/1200/format/webp)