MySQLでONLY_FULL_GROUP_BYを有効にする方法
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
- MySQL Workbenchを起動し、接続したいデータベースを選択します。
- サーバ管理 > 設定 > SQLモードを選択します。
- 適用 をクリックします。
- 不完全な集計結果を防ぐことができます。
- クエリのパフォーマンスを向上させることができます。
- 既存のクエリが影響を受ける可能性があります。
- 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
コードの説明
- 最初に、
users
というテーブルを作成し、データ挿入を行います。 - 次に、
ONLY_FULL_GROUP_BY
を無効と有効にして、それぞれクエリを実行します。 - 無効の場合、
country
ごとのユーザー数が集計されます。 - 最後に、
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