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 インストールに関する詳細なチュートリアル

推薦する

background-positionプロパティでのパーセンテージ値の使用法の検討

背景位置が背景画像の表示に与える影響この2日間のプロジェクトでホームページの写真を入れ替えていたとこ...

Docker コンテナのネットワーク障害に対する 6 つの解決策

Docker コンテナのネットワーク障害に対する 6 つの解決策注: 以下の方法は、コンテナ内のパブ...

MySQL でのトリガーとカーソルの紹介と使用

トリガーの紹介トリガーは、テーブルに関連付けられた特別なストアド プロシージャであり、テーブル内のデ...

js は、Element の入力コンポーネントのいくつかの機能を実装し、それをコンポーネントにカプセル化します (サンプルコード)

現在実装されているのは、基本的な使用方法、クリア可能なボックス、パスワードボックスです。参考リンク:...

HTML のオートコンプリートを無効にして履歴を表示しないようにする

入力ボックスには、コンテンツを入力するときに常に入力履歴が表示されます。これを無効にする現在の方法は...

MySQLデータベースの基本構文と操作

MySQLデータベースの基本構文DDL操作データベース作成構文: create database デ...

HTML チュートリアル: DOCTYPE の省略形

HTML コードを書くとき、最初の行は DOCTYPE にする必要がありますが、DOCTYPE は通...

MySQL テーブル自動増分 ID オーバーフロー障害レビュー ソリューション

問題: MySQLテーブル内の自動増分IDのオーバーフローによりビジネスブロックが発生した背景: t...

MySQL データベースの制約とデータ テーブルの設計原則

目次1. データベースの制約1.1 はじめに1.2 制約の種類1.3 ヌルでない1.4 ユニーク1....

JavaScript におけるシリアル操作と並列操作

目次1. はじめに2. es5メソッド3. 非同期関数のシリアル実行4. 非同期関数の並列実行5. ...

カスタム Docker イメージを作成するための Dockerfile の詳細な説明と CMD と ENTRYPOINT 命令の比較

1. 概要Docker イメージを作成するには、次の 3 つの方法があります。 Docker コミッ...

ネイティブ js を使用してライブ バレット スクリーンのスクロール効果をシミュレートします。

目次1. 基本原則2. 特定のコード要約する1. 基本原則まず、生放送エリアを10の部分に分割し(個...

Vite と Vue CLI の長所と短所

Vue エコシステムには Vite と呼ばれる新しいビルド ツールがあり、Vue CLI よりも 1...

Web デザインでフラッシュ オーバーレイ ポップアップ レイヤーの z-index プロパティを設定しても機能しない

デフォルトでは、Flash は常にページのトップレベルに表示されます。つまり、ページに DHTML ...

Docker の MySQL コンテナのタイムゾーン問題の修正

序文Ahhang が Springboot プロジェクトを開発していたとき、フロントエンドから検証コ...