MySQL が group by をサポートしない場合の解決策の概要

MySQL が group by をサポートしない場合の解決策の概要

MySQL 5.7.x の最新バージョンをダウンロードしてインストールしました。デフォルトでは、only_full_group_by モードが有効になっています。ただし、このモードを有効にした後、元の group by ステートメントでエラーが発生したため、削除しました。

only_full_group_by をオンにすると、group by は、影響を受けるフィールド情報しか取得できず、影響を受けない他のフィールドとは共存できない、distinct と同じになるように感じます。このように、group by の機能は非常に狭くなります。

only_full_group_by モードを有効にすることをお勧めします。

MySQL には、any_value(field) という関数があるため、グループ化されていないフィールドを表示できます (only_full_group_by モードをオフにするのと同じ効果があります)。

具体的なエラーメッセージ:

[エラー] 1055 - ORDER BY 句の式 #1 が GROUP BY 句内になく、GROUP BY 句内の列に機能的に依存しない非集計列 'information_schema.PROFILING.SEQ' が含まれています。これは sql_mode=only_full_group_by と互換性がありません。

1.1. 1. sql_modeを確認する

@@global.sql_mode を選択します。

1.2. 照会された値は次のとおりです。

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

2. ONLY_FULL_GROUP_BY を削除し、値をリセットします。

@@global.sql_mode を選択します。

sql_mode を 'STRICT_TRANS_TABLES、NO_ZERO_IN_DATE、NO_ZERO_DATE、ERROR_FOR_DIVISION_BY_ZERO、NO_AUTO_CREATE_USER、NO_ENGINE_SUBSTITUTION' に設定します。
グローバル sql_mode を 'STRICT_TRANS_TABLES、NO_ZERO_IN_DATE、NO_ZERO_DATE、ERROR_FOR_DIVISION_BY_ZERO、NO_AUTO_CREATE_USER、NO_ENGINE_SUBSTITUTION' に設定します。

2.1. 3. 上記はグローバル sql_mode を変更し、新しく作成されたデータベースに有効です。既存のデータベースの場合は、対応するデータの下で次のコマンドを実行する必要があります。

sql_mode を 'STRICT_TRANS_TABLES、NO_ZERO_IN_DATE、NO_ZERO_DATE、ERROR_FOR_DIVISION_BY_ZERO、NO_AUTO_CREATE_USER、NO_ENGINE_SUBSTITUTION' に設定します。

一般的な解決策は 2 つあります。

1: SQL クエリ ステートメントで group by を必要としないフィールドに対して any_value() 関数を使用することは、すでに多くの関数を開発しているプロジェクトには適していません。結局、元の SQL を変更する必要があります。

3.1.

2: my.cnf (Windows では my.ini) 構成ファイルを変更し、only_full_group_by 項目を削除します。プロジェクトの MySQL が Ubuntu にインストールされている場合は、このファイルを見つけて開きます。sql_mode 構成項目は含まれていないため、削除したくても削除できません。

もちろん、他の方法もあります。MySQLコマンドラインを開いて、コマンドを実行します。

@@sql_mode を選択します。
この方法では、sql_mode の値を見つけて、この値をコピーし、my.cnf に構成項目を追加できます (照会された値から only_full_group_by オプションを削除し、他のオプションをコピーします)。

sql_mode=STRICT_TRANS_TABLES、NO_AUTO_CREATE_USER、NO_ENGINE_SUBSTITUTION;
[mysqld] 行がコメントアウトされている場合は、必ずコメントを解除してください。次に、mysqlサービスを再起動します。

注: コマンドを使用する

sql_mode=STRICT_TRANS_TABLES、NO_AUTO_CREATE_USER、NO_ENGINE_SUBSTITUTION を設定します。

これにより、他のセッションに反映されることなく、1 つのセッションで構成項目を変更できます。

上記が十分に明確でない場合は、次の文を参照してください。

mysqlコマンドラインを入力し、次の2つの文を実行します。

グローバル sql_mode を 'STRICT_TRANS_TABLES、NO_ZERO_IN_DATE、NO_ZERO_DATE、ERROR_FOR_DIVISION_BY_ZERO、NO_AUTO_CREATE_USER、NO_ENGINE_SUBSTITUTION' に設定します。
セッション sql_mode を 'STRICT_TRANS_TABLES、NO_ZERO_IN_DATE、NO_ZERO_DATE、ERROR_FOR_DIVISION_BY_ZERO、NO_AUTO_CREATE_USER、NO_ENGINE_SUBSTITUTION' に設定します。

しかし、mysqlを再起動すると問題が再発します

my.cnf を見つけて編集し、次のコマンドを適切な場所に配置して、mysql サービスを再起動すると、エラーは報告されません。

[mysqld]
sql_mode=STRICT_TRANS_TABLES、NO_ZERO_IN_DATE、NO_ZERO_DATE、ERROR_FOR_DIVISION_BY_ZERO、NO_AUTO_CREATE_USER、NO_ENGINE_SUBSTITUTION

sql_model ステートメントは [mysqld] コンテンツ領域に配置する必要があることに注意してください。

mysql5.7 が group by をサポートしていない問題の解決策

1. sql_modeを確認する

@@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

2. ONLY_FULL_GROUP_BY を削除し、値をリセットします。

@@global.sql_mode を 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' に設定します。

Linux の mysql5.7+ は group by と order by を使用し、設定ファイルを変更せずに ONLY_FULL_GROUP_BY エラーを報告します。

1. mysqlと入力する
2. sql_modeをクエリします。

@@GLOBAL.sql_mode を選択します。
@@SESSION.sql_mode を選択します。
SELECT @@sql_mode;

先頭にONLY_FULL_GROUP_BYがあることがわかりました

3. コマンドラインに入力する
@@GLOBAL.sql_mode を設定します(replace(@@GLOBAL.sql_mode,'ONLY_FULL_GROUP_BY','') を選択)。
上記の 3 つの sql_homes を一度に設定します。

4. mysql を終了し、再度入力して sql_mode を確認します。

基本的にはそれだけです。

<<:  あなたをエキスパートに見せるための 13 個の JavaScript ワンライナー

>>:  Linux CentOS 7.7 システムの VMware インストールに関する詳細なチュートリアル

推薦する

JDBCデータベースリンクと関連メソッドのカプセル化の詳細な説明

JDBCデータベースリンクと関連メソッドのカプセル化の詳細な説明MySQL データベースを使用して、...

Alibaba Cloud centos7にmysql8.0.22をインストールする詳細なチュートリアル

1. MySQLインストールパッケージをダウンロードするまず、https://dev.mysql.c...

Dreamweaver8を使用してウェブサイトのファイルをチェックして整理する方法

Dreamweaver8 を使用して独自の Web サイトを作成する目的は何ですか?インターネットに...

ウェブページのFOUC問題によるウェブページの混乱の解決策

FOUC は Flash of Unstyled Content の略で、FOUC と略されます。簡...

Javascript で SessionStorage と LocalStorage を使用する方法

目次序文SessionStorage と LocalStorage の紹介SessionStorag...

MySQLとOracleの誤解の詳細な説明

目次本質的な違いデータベースセキュリティ権限スキーマの移行パターンオブジェクトの類似性スキーマオブジ...

Mac で docker と kubectl の自動補完コマンドを追加する方法

kubectl の紹介kubectl は、k8s クラスターを操作するためのコマンドライン ツールで...

MySQL 8の新機能ウィンドウ関数の役割

MySQL 8.0 の新機能は次のとおりです。 Unicode 9.0 をすぐに完全にサポートウィン...

MySQL 5.7.9 シャットダウン構文例の詳細な説明

mysql-5.7.9 では、ついにシャットダウン構文が提供されます。以前は、MySQL データベー...

MySQLデータベースのQPSとTPSの意味と計算方法

DB ベンチマーク テストを実行する場合、qps と tps はデータベースのパフォーマンスを測定す...

Tomcat が localhost に通常アクセスすると 404 を報告する問題の解決方法

今日、プロジェクトのホームページにアクセスするために Tomcat を設定していたところ、404 エ...

VMware 仮想マシンに CentOS と Qt をインストールするチュートリアル図

VMware のインストールパッケージのインストールダウンロードアドレス: https://www....

Linux スワップメモリ​​を拡張する方法

スワップ メモリとは、主に物理メモリが不足している場合に、システムがハード ディスク領域の一部をサー...

Chromeの最小フォントサイズ制限12pxに対する最終的な解決策

ウェブサイトを作成するユーザーの多くが、このような問題に遭遇すると思います。Chrome のデフォル...

トランザクション分離レベルのMySQLケース分析

目次1. 理論シリアル化可能繰り返し読み取りコミットされた読み取りコミットされていない読み取り2. ...