我多次在我的localhost上运行了以下sql语句:
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));根据这一员额:
取得的成果:
10:58:22 SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'only_full_group_by','')) 0 row(s) affected 0.00026 sec不更新任何记录。
我继续遇到:
[42000][1055] Expression #9 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'table.column' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by在Workbench中检查服务器变量显示没有变化:

在执行了一些操作之后,我重新启动了MySQL服务--如果当前会话或当前会话重置,这没有任何区别。
那么,如何只更新此设置?
MySQL v5.7.34
select @@sql_mode mode_before_replacing;
SET @@sql_mode = REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY', '');
select @@sql_mode mode_after_replacing;响应:
09:50:15 select @@sql_mode mode_before_replacing LIMIT 0, 50000 1 row(s) returned 0.00025 sec / 0.000032 sec
09:50:15 SET @@sql_mode = REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY', '') 0 row(s) affected 0.00024 sec
09:50:15 select @@sql_mode mode_after_replacing LIMIT 0, 50000 1 row(s) returned 0.00012 sec / 0.000010 sec错误仍然存在。
发布于 2023-01-27 17:17:29
使用SET全局时,它不会更改当前会话的变量。当您连接时,会话变量是从全局变量中复制的,而且在大多数情况下,它们不会注意之后对全局变量的更改(除了少数例外,例如read_only)。
重新启动MySQL服务器时,会重置对全局变量所做的任何自定义更改。全局变量来自持久化选项文件(通常是my.cnf)。
因此,有三种可能的解决方案:
SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));这将设置当前会话变量,而不是全局变量。然后你就可以测试。更改将只影响当前会话,当该会话断开时,设置将与其一起进行。
SET GLOBAL sql_mode=...然后重新连接,开始一个新的会话。它将复制全局变量的新值。
SET PERSIST sql_mode=...这是MySQL 8.0中的一个新特性,因此您必须进行升级。它的作用类似于SET全局(即不更改当前会话),但它保存了文件中的值,因此如果您重新启动MySQL服务器,它仍然记得您更改了它。详细信息请阅读https://dev.mysql.com/doc/refman/8.0/en/persisted-system-variables.html。
https://dba.stackexchange.com/questions/322631
复制相似问题