Die Verwendung von „group by“ in MySQL führt immer zu Fehler 1055 (empfohlen)

Die Verwendung von „group by“ in MySQL führt immer zu Fehler 1055 (empfohlen)

Da die Verwendung von group by in MySQL immer zu Fehler 1055 führt, muss ich die Ursache prüfen. Ich habe nach relevanten Informationen gesucht und notiere mir nun die Notizen zum späteren Nachschlagen:

sql_mode: Kurz gesagt, es definiert die SQL-Syntax, die Ihr MySQL unterstützen sollte, Datenvalidierung usw.

select @@sql_mode: Mit diesem Befehl können wir den SQL-Modus unserer aktuellen Datenbank anzeigen

mysql> wähle @@sql_mode;
+---------------------------------------------------------------------------------------------------------------------------------------------------+
| @@sql_mode |
+---------------------------------------------------------------------------------------------------------------------------------------------------+
| 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 |
+---------------------------------------------------------------------------------------------------------------------------------------------------+
1 Zeile im Satz (0,00 Sek.)

Schauen wir uns die Bedeutung der einzelnen Werte von sql_mode an:

NUR_VOLLSTÄNDIG_GRUPPIEREN_NACH:

Bei GROUP BY-Aggregationsvorgängen gilt: Wenn die Spalten in SELECT nicht in GROUP BY erscheinen, wird dieses SQL als ungültig betrachtet, da die Spalten nicht in der GROUP BY-Klausel enthalten sind.

Aufgrund von only_full_group_by können wir, wenn wir die Group-By-Anweisung in MySQL korrekt verwenden möchten, nur column1 aus tb1 group by column1 auswählen (das heißt, nur die Group-By-Felder können angezeigt werden, alle anderen melden den Fehler 1055).

Beispiele:

mysql> wähle * aus tt1;
+----+-------+--------+
| ID | Name | Geschlecht |
+----+-------+--------+
| 1 | xiong | 0 |
| 2 | ying | 0 |
| 3 | cai | 0 |
| 4 | zhang | 0 |
| 5 | li | 1 |
| 6 | wang | 1 |
+----+-------+--------+
6 Zeilen im Satz (0,00 Sek.)
 
mysql> wähle ID, Name aus tt1-Gruppe nach Name;
FEHLER 1055 (42000):

mysql> wähle * aus tt1;
+----+-------+--------+
| ID | Name | Geschlecht |
+----+-------+--------+
| 1 | xiong | 0 |
| 2 | ying | 0 |
| 3 | cai | 0 |
| 4 | zhang | 0 |
| 5 | li | 1 |
| 6 | wang | 1 |
+----+-------+--------+
6 Zeilen im Satz (0,00 Sek.)
mysql> wähle Namen aus tt1-Gruppe nach Namen;
+----------+
| Name |
+----------+
| cai |
| li |
|wang |
| xiong |
| ying |
| thomas |
+----------+
6 Zeilen im Satz (0,00 Sek.)

Wenn wir group by also korrekt verwenden möchten, müssen wir only_full_group_by löschen.

set sql_mode=(select replace(@@sql_mode,'ONLY_FULL_GROUP_BY','')); Sie können diese Anweisung verwenden, um only_full_group_by durch ein Leerzeichen zu ersetzen, sodass wir mysql> SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')); verwenden können.
Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)
 
mysql> wähle ID, Name aus tt1-Gruppe nach Name;
+----+--------+
| Ich würde | Name |
+----+--------+
| 3 | cai |
| 5 | li |
| 6 | wang |
| 1 | xiong |
| 2 | ying |
| 4 | Zhang |
+----+--------+
6 Zeilen im Satz (0,00 Sek.)

Diese Methode ist jedoch nur eine temporäre Änderung. Wir können die Konfigurationsdatei my.ini ändern

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

STRICT_TRANS_TABLES:

Wenn in diesem Modus ein Wert nicht in eine Transaktionstabelle eingefügt werden kann, wird der aktuelle Vorgang unterbrochen und es werden den nicht-transaktionalen Tabellen keine Beschränkungen auferlegt.

NO_ZERO_IN_DATE:

Im strikten Modus werden Daten mit einem Monats- oder Tagesteil von 0 nicht akzeptiert. Wenn wir die Option IGNORE verwenden, fügen wir für ähnliche Daten „0000-00-00“ ein. Im nicht strikten Modus wird das Datum akzeptiert, aber eine Warnung generiert.

NO_ZERO_DATE:

Im strengen Modus wird „0000-00-00“ nicht als gültiges Datum betrachtet. Mit der Option IGNORE können Sie weiterhin Nulldaten einfügen. Im nicht strikten Modus wird das Datum akzeptiert, aber eine Warnung wird generiert

FEHLER BEI DIVISION DURCH NULL:

Im strikten Modus erzeugt eine Division durch Null (oder MOD(X, 0)) während eines INSERT oder UPDATE einen Fehler (ansonsten eine Warnung). Wenn dieser Modus nicht angegeben ist, gibt MySQL bei einer Division durch Null NULL zurück. Bei Verwendung in INSERT IGNORE oder UPDATE IGNORE generiert MySQL eine Division-durch-Null-Warnung, das Ergebnis der Operation ist jedoch NULL.

NO_AUTO_CREATE_USER:

Verhindert, dass GRANT automatisch neue Benutzer erstellt, sofern nicht auch ein Kennwort angegeben wird.

KEIN_ENGINE_SUBSTITUTION:

Wenn eine erforderliche Speicher-Engine deaktiviert oder nicht kompiliert ist, wird ein Fehler ausgegeben. Wenn dieser Wert nicht festgelegt ist, wird stattdessen die Standardspeicher-Engine verwendet und eine Ausnahme ausgelöst.

3. Es wird gesagt, dass MySQL 5.0 und höhere Versionen drei SQL-Mode-Modi unterstützen: ANSI, TRADITIONAL und STRICT_TRANS_TABLES.

1. ANSI-Modus: Lockerer Modus, ändert Syntax und Verhalten, um eine größere Konsistenz mit Standard-SQL zu erreichen. Überprüfen Sie die eingefügten Daten. Wenn sie nicht dem definierten Typ oder der definierten Länge entsprechen, passen Sie den Datentyp an oder kürzen Sie ihn vor dem Speichern und geben Sie eine Warnung aus. Um den am Anfang des Artikels genannten Fehler zu beheben, können Sie zunächst sql_mode auf ANSI-Modus setzen, damit Sie Daten einfügen können und die Feldwerte, die sich aus dem Divisor 0 ergeben, von der Datenbank durch NULL-Werte ersetzt werden. Stellen Sie den aktuellen Datenbankmodus auf ANSI-Modus ein:

 mysql> setze @@sql_mode=ANSI;

2. TRADITIONELLER Modus: Strenger Modus. Beim Einfügen von Daten in die MySQL-Datenbank wird eine strenge Datenüberprüfung durchgeführt, um sicherzustellen, dass keine falschen Daten eingefügt werden können.

Fehler: Fehler, nicht nur Warnungen. Bei Verwendung für Transaktionen wird die Transaktion zurückgesetzt. Hinweis: Brechen Sie INSERT/UPDATE sofort ab, wenn ein Fehler auftritt. Dies ist nicht erwünscht, wenn Sie eine nicht transaktionale Speicher-Engine verwenden, da Datenänderungen, die vor dem Fehler vorgenommen wurden, nicht „übernommen“ werden, was zu „teilweise ausgeführten“ Aktualisierungen führt.

Stellen Sie den aktuellen Datenbankmodus auf den TRADITIONAL-Modus ein:

mysql> setze @@sql_mode=TRADITIONAL;

3. STRICT_TRANS_TABLES-Modus: Strenger Modus, es wird eine strenge Datenüberprüfung durchgeführt, falsche Daten können nicht eingefügt werden und ein Fehler wird gemeldet. Wenn der angegebene Wert nicht in die Transaktionstabelle eingefügt werden kann, wird die Anweisung abgebrochen. Bei nicht transaktionalen Tabellen wird die Anweisung abgebrochen, wenn der Wert in einer einzeiligen Anweisung oder in Zeile 1 einer mehrzeiligen Anweisung erscheint. Stellen Sie den aktuellen Datenbankmodus auf den Modus STRICT_TRANS_TABLES ein:

mysql> setze @@sql_mode=STRICT_TRANS_TABLES;

Es gibt kein bestes oder schlechtestes Modell, sondern nur das am besten geeignete Modell. Sie müssen entsprechend Ihrer tatsächlichen Situation den am besten geeigneten Modus auswählen! ! !

Ein weiterer Punkt ist, dass die Änderungen am Datenbankmodus hier alle einmalig auf Sitzungsebene erfolgen und nicht zählen, wenn Sie sie schließen und erneut öffnen! ! !

Sie können es auch über die Konfigurationsdatei festlegen: vim /etc/my.cnf

Fügen Sie die folgende Konfiguration in my.cnf (my.ini) hinzu:

[mysqld]
sql_mode = 'der gewünschte Modus'

Zusammenfassen

Oben habe ich Ihnen den Fehler 1055 vorgestellt, der immer auftritt, wenn Sie „group by“ in MySQL verwenden. Ich hoffe, es wird Ihnen helfen!

Das könnte Sie auch interessieren:
  • MySQL optimiert GROUP BY (loser Index-Scan vs. kompakter Index-Scan)
  • MySQL-Optimierung – GROUP BY-Lösung
  • MySQL-Gruppe durch Gruppieren mehrerer Felder
  • Implementieren Sie Group By basierend auf MySQL, um die neuesten Daten jeder Gruppe zu erhalten
  • Sollte ich zum Entfernen von Duplikaten in MySQL „distinct“ oder „group by“ verwenden?
  • Lösung für den ONLY_FULL_GROUP_BY-Fehler in Mysql5.7 und höher
  • MySQL-Fall beim Gruppieren nach Beispiel
  • Lösen Sie das Gruppieren-nach-Abfrage-Problem nach dem Upgrade von Mysql auf 5.7
  • So optimieren Sie MySQL-Gruppen nach Anweisungen

<<:  Netzwerkmanagement und Netzwerkisolationsimplementierung von Docker-Containern

>>:  Grundlegende Ideen und Codes zur Implementierung von Videoplayern in Browsern

Artikel empfehlen

VMware ESXI-Servervirtualisierungscluster

Inhaltsverzeichnis Zusammenfassung Umgebung und W...

So implementieren Sie Datenpersistenz mit dem Vuex-Drittanbieterpaket

Zweck: Ermöglichen Sie die gleichzeitige lokale S...

JavaScript-Code zur Implementierung der Weibo-Batch-Unfollow-Funktion

Ein cooler JavaScript-Code, um Weibo-Benutzern st...

Floaten und Floaten löschen in der Übersichtsseite

1. Float: Der Hauptzweck besteht darin, den Effek...

Detaillierte Hinweise zu React für Einsteiger

Inhaltsverzeichnis 1. Grundlegendes Verständnis v...

Beispiele für Clearfix und Clear

In diesem Artikel wird hauptsächlich die Verwendun...

Einführung in den HTML-Standard für chinesische Zeichenkodierung

In HTML müssen Sie die von der Webseite verwendet...

Vor- und Nachteile von bedingten Kommentaren im Internet Explorer

Die bedingten Kommentare des Internet Explorers s...

Vue macht Div-Höhe verschiebbar

In diesem Artikel wird der spezifische Code von V...

Einführung in die wichtigsten Browser und ihre Kernel

Trident-Kern: IE, MaxThon, TT, The World, 360, So...