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:
|
<<: Netzwerkmanagement und Netzwerkisolationsimplementierung von Docker-Containern
>>: Grundlegende Ideen und Codes zur Implementierung von Videoplayern in Browsern
Inhaltsverzeichnis Zusammenfassung Umgebung und W...
Zweck: Ermöglichen Sie die gleichzeitige lokale S...
Ein cooler JavaScript-Code, um Weibo-Benutzern st...
Tatsächlich haben viele Unternehmen ähnliche Funk...
1. Float: Der Hauptzweck besteht darin, den Effek...
Inhaltsverzeichnis 1. Änderung der Ubuntu-Quelle ...
Dieser Artikel beschreibt, wie die Koexistenz von...
Inhaltsverzeichnis 1. Grundlegendes Verständnis v...
In diesem Artikel wird hauptsächlich die Verwendun...
In HTML müssen Sie die von der Webseite verwendet...
Überblick In einer relationalen Datenbank ist ein...
Die bedingten Kommentare des Internet Explorers s...
In diesem Artikel wird der spezifische Code von V...
Trident-Kern: IE, MaxThon, TT, The World, 360, So...
Inhaltsverzeichnis 1. Gemeinsam genutztes CommonM...