Mysql8.0 ONLY_FULL_GROUP_BY y anteriormente, así como otras causas de error en detalle acerca de las soluciones sql_mode
Hoy estamos hablando de la cuestión en mysql8 ONLY_FULL_GROUP_BY, creo que todos en el grupo mediante el uso de la función de repente saltar de un mensaje de error:
ERROR 1055 (42000): Expresión # 7 de lista SELECT no es en la cláusula POR GRUPO y contiene la columna no agregada 'postscan.verifyDelayLog.auditor' que no es funcionalmente dependiente de columnas en la cláusula GROUP BY; esto es withsql_mode incompatible = ONLY_FULL_GROUP_BY
En la versión mysql8.0 anteriormente, para este grupo de operaciones agregadas, si la columna en la selección, no aparece en el grupo por, entonces este SQL no es legítimo, ya que la columna no está en el grupo por la cláusula, por lo para este modo de establecer una base de datos, cuando se utiliza por grupo, debemos usar MAX (), SUM (), ANT_VALUE () esta función agregada, para completar el grupo de polimerización por operación, por lo que una vez dicho esto, cómo desactivar que?
Después de que tengamos algunas Baidu, el resultado obtenido es de aproximadamente ONLY_FULL_GROUP_BY, pero seguir el tutorial dicho, sólo modificar el my.cnf,
【
Adición de la siguiente 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'
】
El archivo de configuración añadiendo el parámetro apropiado [en adelante se denominará] para reiniciar el tiempo, es todavía muy lejos de la gente satisfactorios, incluso los que no les tutoriales a prueba práctica, para apagar, pero también traen nuevo error de MySQL, o completamente comenzará a ser dado, hoy vengo a que uno a uno con una descripción detallada de estos parámetros, y soluciones.
sql_mode variables, que fácilmente se pasa por alto, el valor predeterminado es un valor nulo, en esta disposición es permitir algunas operaciones ilegales, tales como permitir que algunos datos no válidos se inserta. Este valor se debe establecer en el modo estricto en un entorno de producción, el desarrollo, la base de datos del entorno de prueba debe ajustarse de modo que el desarrollo y fases de prueba pueden encontrar el problema.
valores comunes sql_mode son los siguientes:
ONLY_FULL_GROUP_BY: Para GROUP BY operaciones agregadas, si una columna en el SELECT, no aparece en un GROUP BY, entonces el SQL no es legítimo, ya que la columna no está en la cláusula GROUP BY.
NO_AUTO_VALUE_ON_ZERO: El valor se inserta desde el impacto de la columna de crecimiento. En la configuración predeterminada, el inserto 0 o NULL en nombre de un valor de crecimiento autogenerado. Si desea insertar un valor de 0, y que la columna es auto-crecimiento, esta opción es muy útil.
STRICT_TRANS_TABLES: En este modo, si un valor no se puede insertar en una tabla de transacciones, interrumpiendo la operación actual, que no se limita a las tablas no transaccionales
NO_ZERO_IN_DATE: en modo estricto, no se permite que la fecha y el mes de cero
NO_ZERO_DATE: establecer el valor, la base de datos MySQL no permite la fecha cero inserción, inserción cero fechas generará un error en lugar de una advertencia.
ERROR_FOR_DIVISION_BY_ZERO: INSERT o UPDATE en el proceso, si los datos son cero, un error en lugar de una advertencia. Si no se da este modo, a continuación, devolver NULL cuando los datos MySQL cero
GRANT prohíbe a los usuarios crear una contraseña en blanco: NO_AUTO_CREATE_USER
NO_ENGINE_SUBSTITUTION: Si necesita un motor de almacenamiento está deshabilitado o no compilado, a continuación, generará un error. Cuando este valor no está establecido, la sustitución del motor de almacenamiento por defecto, y se produce una excepción
PIPES_AS_CONCAT: el operador "||" no se considera como cadenas de conexión o del operador, y que la base de datos Oracle es el mismo, así como funciones de fundido de concatenación cadena similar
ANSI_QUOTES: ANSI_QUOTES entonces se activa, no se puede utilizar para hacer referencia a una cadena de dobles comillas, porque se interpreta como un identificador
Descripción terminado la introducción, pero todavía se da en 8.0 en un entorno tal, por las siguientes razones:
ERROR 1231 (42000): Variable 'sql_mode' no se puede ajustar al valor de 'NO_AUTO_CREATE_USER'
8.0 anterior se ha cancelado palabra clave NO_AUTO_CREATE_USER, elimine la palabra clave para la declaración de sql
Por último, / etc / my.cnf archivo de configuración modificado: sql_mode = 'STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_ENGINE_SUBSTITUTION'
MySQL reiniciar el servicio, ya está! ~
Aquí, doy las otras dos soluciones:
El segundo enfoque, sin modificar el archivo de configuración, modificar el uso Navicat
Entrar en la interfaz de línea de comandos
Intro: SELECT @@ 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
Luego modificamos sql_mode
sql_mode conjunto global = 'STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_ENGINE_SUBSTITUTION';
Ejecutar el SQL, por grupo puede ser utilizado, pero este método no es una cura, tras el reinicio de MySQL, todavía no se puede utilizar el grupo por lo tanto, el primer método es el más eficaz.
Un tercer enfoque sin modificar el archivo de configuración, modificar el uso Navicat
Entrar en la interfaz de línea de comandos
Intro: SELECT @@ sql_mode; Nota: De esta manera, la sesión predeterminada, es completa: 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
Luego modificamos sql_mode
输入: Establecer sesión de sql_mode = 'STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION';
Y ejecute el SQL:
***** ***** mal o reportado ONLY_FULL_GROUP_BY
############## solución ###################
Antes de configurar sql_mode consulta comunicado
Establecer sesión de sql_mode = 'STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION';
Más tarde, la nueva consulta (incluye el grupo de) los estados no establecen sql_mode juntos hasta que se cierre este sentido hasta el momento
A continuación, se ejecuta el sql no es capaz de ejecutarlo
sql_mode SET GLOBAL = 'STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION';
SELECT @@ GLOBAL.sql_mode;
Explicación de la forma 3:
1. De hecho, cuando se habla del tercer método mencionado SELECT @@ sql_mode, de hecho, aquí la sesión predeterminada, es completa: SELECT @@ SESSION.sql_mode;
2.SESSION sesión actual está destinado ----> Esto explicaría la conexión hasta que se cierre hasta
3. ¿Por qué el conjunto sql_mode línea de comandos, y luego crear una nueva consulta o inútil?
4. De hecho, sólo tiene que teclear SELECT @@ sql_mode en la nueva consulta, se encuentra que se establece en la línea de comandos y no surten efecto
5. Por lo tanto, sólo podemos más en este contexto (sesión) de la re-set sql_mode Nueva consulta, después de la conexión (esta sesión) ya no es necesario
6. En esta sección se explica el lenguaje "set antes de la declaración de su sql_mode consulta" Esta frase
2 Descripción de la forma en que los dos métodos de enfoque 3
Contenido 1. Ambos métodos conjunto sql_mode, como se reiniciará mysql en mi despliegue de Linux, mientras que vuelvo a la opción del modo SQL archivo de configuración especificado en my.cnf instalado en el interior
2. Comparar esta frase acerca
3. Medios: después del reinicio de MySQL en Linux, que ya no son válidos en conjunto Navicat, pero en base a la configuración de archivo de configuración especificado, este archivo se encuentra en my.cnf
Nota: Ahora voy a my.cnf enumerado para su referencia