MySQLでONLY_FULL_GROUP_BYを有効にする方法

2024-04-02

MySQLでONLY_FULL_GROUP_BYを有効にする方法

ONLY_FULL_GROUP_BYを有効にする方法

方法 1:MySQLコマンドライン

mysql -uroot -p

# パスワードを入力

SET GLOBAL sql_mode='ONLY_FULL_GROUP_BY';

# 設定を確認

SELECT @@sql_mode;

方法 2:my.cnfファイル

[mysqld]
sql_mode='ONLY_FULL_GROUP_BY'

方法 3:MySQL Workbench

  1. MySQL Workbenchを起動し、接続したいデータベースを選択します。
  2. サーバ管理 > 設定 > SQLモードを選択します。
  3. 適用 をクリックします。
  • 不完全な集計結果を防ぐことができます。
  • クエリのパフォーマンスを向上させることができます。
  • 既存のクエリが影響を受ける可能性があります。
  • MariaDBでは、デフォルトでONLY_FULL_GROUP_BYが有効になっています。

補足

  • ONLY_FULL_GROUP_BY は、STRICT_TRANS_TABLES と互換性がありません。
  • ONLY_FULL_GROUP_BY を有効にした場合、GROUP BY 句で指定されていない列に対して集計関数を適用すると、エラーが発生します。

SELECT COUNT(*)
FROM users
GROUP BY country;

# このクエリは、ONLY_FULL_GROUP_BY が有効の場合、エラーが発生します。

SELECT COUNT(*)
FROM users
GROUP BY country, city;

# このクエリは、ONLY_FULL_GROUP_BY が有効でもエラーは発生しません。



環境

  • MySQL 8.0

コード

-- テーブル作成
CREATE TABLE users (
  id INT NOT NULL AUTO_INCREMENT,
  name VARCHAR(255) NOT NULL,
  country VARCHAR(2) NOT NULL,
  city VARCHAR(255) NOT NULL,
  PRIMARY KEY (id)
);

-- データ挿入
INSERT INTO users (name, country, city) VALUES
  ('John Doe', 'US', 'New York'),
  ('Jane Doe', 'US', 'Los Angeles'),
  ('Peter Smith', 'UK', 'London'),
  ('Sarah Jones', 'UK', 'Manchester');

-- ONLY_FULL_GROUP_BY 無効
SET sql_mode='';

-- 国ごとにユーザー数を集計
SELECT country, COUNT(*) AS user_count
FROM users
GROUP BY country;

-- 結果
-- | country | user_count |
-- |---|---|
-- | US      | 2         |
-- | UK      | 2         |

-- ONLY_FULL_GROUP_BY 有効
SET sql_mode='ONLY_FULL_GROUP_BY';

-- 国と都市ごとにユーザー数を集計
SELECT country, city, COUNT(*) AS user_count
FROM users
GROUP BY country, city;

-- 結果
-- | country | city      | user_count |
-- |---|---|---|
-- | US      | New York   | 1         |
-- | US      | Los Angeles | 1         |
-- | UK      | London     | 1         |
-- | UK      | Manchester  | 1         |

-- 国ごとにユーザー数を集計
SELECT country, COUNT(*) AS user_count
FROM users
GROUP BY country;

-- エラー
-- ERROR 1055 (42000): 'city' is not in GROUP BY clause and is not an aggregate function

コードの説明

  1. 最初に、users というテーブルを作成し、データ挿入を行います。
  2. 次に、ONLY_FULL_GROUP_BY を無効と有効にして、それぞれクエリを実行します。
  3. 無効の場合、country ごとのユーザー数が集計されます。
  4. 最後に、country ごとのユーザー数を集計しようとすると、エラーが発生します。

このサンプルコードは、ONLY_FULL_GROUP_BY の動作を理解するのに役立ちます。




ONLY_FULL_GROUP_BY を有効にする他の方法

方法 4:mysqldump を使用してデータベースをダンプする

mysqldump -uroot -p --sql-mode='ONLY_FULL_GROUP_BY' database_name > dump.sql

方法 5:Docker を使用して MySQL サーバを起動する

docker run --name mysql -p 3306 -e MYSQL_ROOT_PASSWORD=password -e MYSQL_SQL_MODE='ONLY_FULL_GROUP_BY' mysql:8.0

方法 6:アプリケーションコードを変更する

アプリケーションコードを変更して、GROUP BY 句で指定されていない列に対して集計関数を適用しないようにすることもできます。


mysql group-by mariadb


データベースのパフォーマンスを向上させる!MySQLプロシージャと関数のチューニング

それぞれの概要MySQL プロシージャ と MySQL 関数 は、どちらもデータベース上で処理を実行するプログラムです。しかし、いくつかの重要な違いがあります。1 MySQL プロシージャ複数の SQL 文をまとめて実行できるプログラムデータベースの操作や複雑な処理をカプセル化できる...


ネストされたセット、Closure Table、Adjacency List:MySQLで階層構造データを扱う3つの手法

この解説では、MySQLにおける再帰的なクエリの仕組みと実装方法を、具体的な例を用いて分かりやすく解説します。また、実用的なユースケースもいくつか紹介します。再帰的なクエリは、自身を呼び出すことで、階層構造データを再帰的に処理するクエリです。具体的には、以下の2つの要素で構成されます。...


MariaDBに接続する:PDO、MySQLi、mysqlの比較

PHPでMariaDBデータベースに接続するには、PDO (PHP Data Objects) というデータベース抽象化レイヤを使用するのが一般的です。PDOは、データベースとの接続と操作を統一されたインターフェースで提供することで、コードの移植性と保守性を向上させてくれます。...


PHPでMySQLデータベースに接続する:mysql() vs mysqli()

PHP スクリプトで MySQL データベースに接続する場合、mysql() と mysqli() という2つの異なるインターフェースを使用できます。近年、mysql() は非推奨となり、mysqli() が推奨されています。なぜ mysql() は機能しないのか?...


MySQL 8.0で「Authentication plugin 'caching_sha2_password' cannot be loaded」エラーが発生する原因と解決方法

MySQL 8.0 にアップグレードした際に、caching_sha2_password 認証プラグインがロードできないというエラーが発生する場合があります。これは、MySQL 8.0 でデフォルトの認証プラグインが変更されたためです。原因...


SQL SQL SQL SQL Amazon で見る



MySQL Workbench で ONLY_FULL_GROUP_BY を無効にする方法

このモードは、データの整合性を保つために導入されました。しかし、場合によっては、このモードが原因でエラーが発生することがあります。ONLY_FULL_GROUP_BY を無効にする方法はいくつかあります。SET GLOBAL sql_mode オプションを使用する