問題の説明
ApsaraDB RDS for MySQL インスタンスで SQL 文を実行すると、次のエラーメッセージが表示されます。
1055(42000): SELECT list is not in GROUP BY clause and contains nonaggregated column原因と解決策
このエラーは、sql_mode パラメーターが変更されたために発生します。
原因 1: ユーザーが sql_mode パラメーターを変更し、GROUP BY 構文が無効になる
原因: ユーザーが sql_mode パラメーターの値に
ONLY_FULL_GROUP_BYを追加したため。その結果、GROUP BY 句の構文が標準に準拠しなくなります。解決策: ApsaraDB RDS コンソール にログインし、リージョンを選択して、RDS インスタンスの ID をクリックします。[パラメーター] ページで、
sql_modeパラメーターの値からONLY_FULL_GROUP_BYを削除して、GROUP BY 句の厳密なチェックを無視します。詳細については、「インスタンスパラメーターの変更」をご参照ください。
原因 2: ビジネス側のドライバーが sql_mode パラメーターを変更し、GROUP BY 句でエラーが発生する
原因: ビジネス側のドライバーが
sql_modeパラメーターの値を変更したため。たとえば、ビジネス側の ADO.NET ドライバーがsql_modeパラメーターの値を変更すると、GROUP BY 句でエラーが発生します。
自動インクリメント列の値を INSERT 文で返す必要がある場合、ドライバーは INSERT 文が実行される前に現在のセッションの
sql_modeパラメーターの値を自動的に変更しますが、INSERT 文の実行後にsql_modeパラメーターを元の値に戻しません。現在のセッションが引き続き使用されている場合、GROUP BY 句を含む SELECT 文を実行するとエラーが発生します。解決策: ADO.NET ドライバーを使用している場合は、INSERT 文を実行した後、クエリを実行する前に、
sql_modeパラメーターを元の値に戻す文をビジネスコードに追加します。SET session sql_mode = default;