MySQL 1055-Fehler – dieser ist mit der sql_mode=only_full_group_by-Lösung nicht kompatibel

Vorwort

Kürzlich stieß das Projekt auf die Notwendigkeit, doppelte Daten in der Datenbank abzufragen und gleichzeitig einige historische Daten auszuschließen, sodass diese nach einem bestimmten Feld gruppiert werden und einige Felder der Daten zur Anzeige herausgenommen werden. Dies ist die Verwendung der Group-by-Anweisung Wenn MySQL jedoch in der höheren Version vorhanden ist und das ausgewählte Feld beim Ausführen von „Gruppe nach“ nicht zum Feld „Gruppe nach“ gehört, meldet die SQL-Anweisung einen Fehler. Die Fehlermeldung lautet wie folgt:

1055 - Expression #1 of SELECT list is not in GROUP BY 
clause and contains nonaggregated column
 'data_export.TrustDataController_store_chain_data_info_method.block_height' 
 which is not functionally dependent on columns in GROUP BY clause; 
 this is incompatible with sql_mode=only_full_group_by, Time: 0.004000s

Problemanalyse

Prinzipielle Ebene

Dieser Fehler tritt in MySQL-Version 5.7 und höher auf. Die
Standard-SQL-Konfiguration von MySQL-Version 5.7 und höher lautet: sql_mode="ONLY_FULL_GROUP_BY". Diese Konfiguration implementiert strikt den „SQL92-Standard“. Beim Upgrade von 5.6 auf 5.7 entscheiden sich die meisten für die Anpassung von sql_mode, um die Syntaxkompatibilität mit 5.6 zu gewährleisten und eine größtmögliche Kompatibilität mit dem Programm zu gewährleisten.

SQL-Ebene

Wenn SQL ausgeführt wird, liegt der Grund dafür einfach darin,
dass ONLY_FULL_GROUP_BY aktiviert ist, wenn das ausgewählte Feld nicht in der Gruppierung nach enthalten ist und das ausgewählte Feld keine Aggregatfunktion (SUM, AVG, MAX, MIN usw.) verwendet. , Dann wird diese SQL-Abfrage von MySQL als illegal angesehen und meldet einen Fehler

Authentifizierungsproblem

  1. Fragen Sie die Datenbankversion ab
SELECT VERSION();

Fügen Sie hier eine Bildbeschreibung ein
Daraus kann geschlossen werden, dass die Datenbankversion auf dem Server 5.7.36 ist.
2. Sehen Sie sich die Anweisung von sql_mode an

select @@GLOBAL.sql_mode;

Fügen Sie hier eine Bildbeschreibung ein
Wie aus dem Wert der Abfrageverarbeitung hervorgeht, hat sql_mode das Attribut only_full_group_by aktiviert

Lösung

Methode 1: Verwenden Sie die Funktion ANY_VALUE(), um das Fehlerfeld einzuschließen

Verwenden Sie any_value(), um die Feldnamen in die abzufragende SQL-Anweisung aufzunehmen, und das Ergebnis kann normal abgefragt werden. Ändern Sie einfach den Alias ​​des Abfragefelds nach Bedarf.

SELECT  ANY_VALUE(`block_height`) as block_height, ANY_VALUE(`block_time_stamp`) as block_time_stamp, ANY_VALUE(`tx_hash`) as tx_hash, `_key_ID`, 
ANY_VALUE(`_chain_data_ID`) as _chain_data_ID, ANY_VALUE(`_chain_data_index`) as _chain_data_index, ANY_VALUE(`output1`) as output1
FROM `TrustDataController_store_chain_data_info_method` 
WHERE (_chain_data_index LIKE "%各地级市数据6d767fc5d458fdb0139d6ad0fe69ec91%") GROUP BY _key_ID ORDER BY ANY_VALUE(`block_time_stamp`) desc

Fügen Sie hier eine Bildbeschreibung ein
Funktionsbeschreibung ANY_VALUE():

MySQL有any_value(field)函数,它主要的作用就是抑制ONLY_FULL_GROUP_BY值被拒绝。
这样sql语句不管是在ONLY_FULL_GROUP_BY模式关闭状态还是在开启模式都可以正常执行,不被mysql拒绝。
any_value()会选择被分到同一组的数据里第一条数据的指定列值作为返回数据。
官方有介绍:https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_any-value

Methode 2: Ändern Sie sql_mode vorübergehend über die SQL-Anweisung

Entfernen Sie ONLY_FULL_GROUP_BY und setzen Sie den Wert zurück

SET @@global.sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

Das Obige dient dazu, den globalen SQL-Modus zu ändern, der für die neu erstellte Datenbank gültig ist. Bei einer vorhandenen Datenbank müssen Sie diese unter der entsprechenden Datenbank ausführen

SET sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

Nachteil: Nach dem Neustart des MySQL-Datenbankdienstes wird immer noch ONLY_FULL_GROUP_BY angezeigt, dies ist also nur vorübergehend.

Methode 3: Ändern Sie sql_mode dauerhaft über die Konfigurationsdatei

MySQL wird auf dem Server und lokal installiert, und die Art und Weise, die Konfigurationsdatei zu ändern, ist etwas anders.

1. Ändern Sie die Konfigurationsdatei unter Linux

1) Melden Sie sich bei MySQL an und
melden Sie sich mit dem Befehl mysql -u Benutzername -p an. Geben Sie dann das Kennwort ein und geben Sie SQL ein:

show variables like ‘%sql_mode’;

2) Bearbeiten Sie die Datei my.cnf.
Die Dateiadresse lautet im Allgemeinen: /etc/my.cnf, /etc/mysql/my.cnf.
Bearbeiten Sie die Datei mit dem Befehl vim, suchen Sie den Speicherort des SQL-Modus, entfernen Sie ONLY_FULL_GROUP_BY
und Starten Sie MySQL neu.
Einige Fehler. Möglicherweise gibt es in cnf keinen SQL-Modus, dieser muss hinzugefügt werden:

sql-mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

3) Starten Sie den MySQL-Dienst neu, nachdem die Änderung erfolgreich war

service mysql restart

Melden Sie sich nach dem Neustart bei MySQL an und geben Sie SQL ein: Variablen wie „% sql_mode“ anzeigen; Wenn kein ONLY_FULL_GROUP_BY vorhanden ist, bedeutet dies, dass es erfolgreich war. Wenn nicht, behalten Sie nur
STRICT_TRANS_TABLES, NO_ENGINE_SUBSTITUTION bei.
Der zusätzliche Inhalt lautet:

sql-mode=STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION

Referenzartikel

MySQL-Fehler – dies ist nicht kompatibel mit der perfekten Lösung „sql_mode=only_full_group_by“.

Acho que você gosta

Origin blog.csdn.net/ic_xcc/article/details/125186285
Recomendado
Clasificación