Lösung für den ONLY_FULL_GROUP_BY-Fehler in Mysql5.7 und höher

Lösung für den ONLY_FULL_GROUP_BY-Fehler in Mysql5.7 und höher

Während des jüngsten Entwicklungsprozesses handelte es sich bei der mit der Projektentwicklungsumgebung verbundenen MySQL-Datenbank um die Datenbank von Alibaba Cloud, und die Datenbankversion von Alibaba Cloud ist 5.6. Das MySQL in der Testumgebung ist 5.7 und wurde von mir selbst installiert. Daher haben einige Freunde während des Entwicklungsprozesses versehentlich die SQL-Anweisung geschrieben, die sich auf „Gruppieren nach“ bezieht. In der Entwicklungsumgebung läuft es normal, in der Testumgebung werden jedoch Anomalien festgestellt.

Ursachenanalyse: Die MySQL-Version 5.7 setzt standardmäßig das Attribut mysql sql_mode = only_full_group_by, was einen Fehler verursacht.

Unter ihnen ist ONLY_FULL_GROUP_BY der Schuldige für diesen Fehler. Wenn bei der Group-by-Aggregationsoperation die Spalte in der Auswahl nicht in der Group-by-Klausel erscheint, ist das SQL ungültig, da die Spalte nicht in der Group-by-Klausel enthalten ist. Daher meldet die Datenbank mit gesetztem sql_mode=only_full_group_by einen Fehler, wenn Group-by verwendet wird.

Die Testumgebung hat die neueste Version von MySQL 5.7.x heruntergeladen und installiert. Der Modus only_full_group_by war standardmäßig aktiviert. Nach der Aktivierung dieses Modus meldete die ursprüngliche group_by-Anweisung jedoch einen Fehler und wurde daraufhin entfernt.

Sobald only_full_group_by aktiviert ist, fühlt es sich so an, als ob group by dasselbe wie distinct wird, das nur die davon betroffenen Feldinformationen abrufen kann und nicht mit anderen, nicht davon betroffenen Feldern koexistieren kann. Auf diese Weise wird die Funktion von group by sehr eingeschränkt.

Es ist besser, den Modus only_full_group_by zu aktivieren. Denn in MySQL gibt es eine Funktion: any_value(field) ermöglicht die Darstellung von nicht gruppierenden Feldern (was den gleichen Effekt hat wie das Deaktivieren des only_full_group_by-Modus).

1. Überprüfen Sie sql_mode

Wählen Sie @@sql_mode;

Der abgefragte Wert ist:

NUR_VOLLSTÄNDIGE_GRUPPE_NUR, STRENGE_TRANS_TABELLEN, KEINE_NULL_IM_DATUM, KEIN_NULL_DATUM, FEHLER_FÜR_DIVISION_DURCH_NULL, KEIN_AUTOMATISCHES_ERSTELLEN_BENUTZER, KEIN_ENGINE_SUBSTITUTION

2. Entfernen Sie ONLY_FULL_GROUP_BY und setzen Sie den Wert zurück.

SETZEN Sie @@global.sql_mode = 'STRICT_TRANS_TABLES,KEINE_NULL_IM_DATUM,KEINE_NULL_DATUM,FEHLER_FÜR_DIVISION_DURCH_NULL,KEIN_AUTO_CREATE_USER,KEINE_ENGINE_SUBSTITUTION';

3. Das oben genannte ändert den globalen SQL-Modus, der für neu erstellte Datenbanken gültig ist. Für eine bestehende Datenbank müssen Sie es unter den entsprechenden Daten ausführen

SETZEN Sie den SQL-Modus = 'STRICT_TRANS_TABLES, KEINE_NULL_IM_DATUM, KEIN_NULL_DATUM, FEHLER BEI_DIVISION_DURCH_NULL, KEIN_AUTO_CREATE_USER, KEINE_ENGINE_SUBSTITUTION';

Die obige Methode ist nach dem Neustart der MySQL-Datenbank immer noch ungültig. Die folgende Methode ist nach dem Neustart immer noch wirksam

Suchen Sie die MySQL-Konfigurationsdatei /etc/my.cnf auf dem Linux-System und fragen Sie das Feld sql_mode ab. Ich konnte dieses Schlüsselwort in der Konfigurationsdatei nicht finden und habe es daher manuell hinzugefügt:

sql_mode = STRICT_TRANS_TABLES,KEINE_NULL_IM_DATUM,KEINE_NULL_DATUM,FEHLER_FÜR_DIVISION_DURCH_NULL,KEIN_AUTO_CREATE_USER,KEINE_ENGINE_SUBSTITUTION

Zu beachten ist, dass es in der [mysqld]-Konfiguration hinzugefügt werden muss, damit es nach einem Neustart von mysql wirksam wird. Beenden Sie die Datenbank: exit, restart-Befehl:

Dienst MySQL Neustart

Aktualisieren Sie die Seite und die Fehlermeldung verschwindet. Das Problem wurde erfolgreich gelöst. Stellen Sie erneut eine Verbindung zur Datenbank her, um die SQL_Mode-Konfiguration anzuzeigen. Wählen Sie @@sql_mode:

STRICT_TRANS_TABLES,KEINE_NULL_IM_DATUM,KEIN_NULL_DATUM,FEHLER_FÜR_DIVISION_DURCH_NULL,KEIN_AUTO_CREATE_USER,KEINE_ENGINE_SUBSTITUTION

Dies ist das Ende dieses Artikels über die Lösung des ONLY_FULL_GROUP_BY-Fehlers in Mysql5.7 und höher. Weitere verwandte Mysql5.7 ONLY_FULL_GROUP_BY-Inhalte finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder durchsuchen Sie die verwandten Artikel weiter unten. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • Grafisches Tutorial zur Installation und Konfiguration der MySQL-Version 8.0.24
  • Einige Verbesserungen in MySQL 8.0.24 Release Note
  • Implementierung der MVCC-Mehrversions-Parallelitätskontrolle von MySQL
  • Die beste Lösung zum Zurücksetzen des Root-Passworts von MySQL 8.0.23
  • Informationen zum Konfigurationsproblem bei der Verbindung von MyBatis mit der MySql8.0-Version
  • So lösen Sie das Problem, dass Seata die MySQL 8-Version nicht verwenden kann
  • Detaillierte Erklärung der Verbindung von DBeaver zu MySQL Version 8 und höher und Lösung möglicher Probleme
  • Bei der Verwendung von mybatis-generator mit mysql8.0.3 in IDEA sind Fehler aufgetreten
  • Lösung für das Problem des verstümmelten Codes in MySQL 5.x
  • Detailliertes Tutorial zur Installation der MySQL 8.0.20-Datenbank auf CentOS 7
  • Lösen Sie das Installationsproblem der mysql8.0.19 Winx64-Version
  • Kompatibilitätsprobleme mit Django 2.2 und PyMySQL
  • Schritte zur Installation von MySQL 5.7 im Binärmodus und zur Optimierung des Systems unter Linux
  • Installation verschiedener Versionen von MySQL 8.0.18 und während der Installation aufgetretene Probleme (Zusammenfassung)
  • Sehr detaillierte Anleitung zum Upgrade der MySQL-Version

<<:  Vue implementiert das Senden von Emoticons im Chatfenster

>>:  Lösung für Nginx-Installationsfehler

Artikel empfehlen

So führen Sie geplante PHP-Aufgaben in CentOS7 aus

Vorwort Dieser Artikel stellt hauptsächlich den r...

So implementieren Sie eine geplante Sicherung einer MySQL-Datenbank

1. Erstellen Sie ein Shell-Skript vim backupdb.sh...

Grafisches Tutorial zur Installation und Konfiguration von MySQL 5.7.23

Dieser Artikel zeichnet das Installationstutorial...

Einführung und Verwendung der Angular-Pipeline PIPE

Vorwort PIPE, übersetzt als Pipeline. Angular Pip...

Lebenszyklus und Hook-Funktionen in Vue

Inhaltsverzeichnis 1. Was ist der Lebenszyklus 2....

Python schreibt die Ausgabe in den CSV-Vorgang

Wie unten dargestellt: def test_write(selbst): Fe...

Funktionsüberladung in TypeScript

Inhaltsverzeichnis 1. Funktionssignatur 2. Funkti...

Grundprinzipien für die Zusammenstellung einer Website-Homepage

1. Die Organisationsstruktur des Hypertext-Dokumen...

So verwenden Sie weniger im WeChat-Applet (optimale Methode)

Vorwort Ich bin es gewohnt, Less/Sass zu schreibe...

Detaillierte Einführung in die gespeicherten MySQL-Funktionen

Inhaltsverzeichnis 1. Erstellen Sie eine gespeich...

Detaillierte Erklärung des JavaScript-Proxy-Objekts

Inhaltsverzeichnis 1. Was ist ein Proxy? 2. Wie w...

Detaillierte Erläuterung der langsamen MySQL-Protokollabfrage

Langsame Protokollabfragefunktion Die Hauptfunkti...