【问题标题】:IBM Cloud - Compose for MySQL - Change sql_mode - to enable GROUP BY queriesIBM Cloud - Compose for MySQL - 更改 sql_mode - 以启用 GROUP BY 查询
【发布时间】:2018-02-13 12:33:12
【问题描述】:

我在 IBM Cloud CF 应用程序中使用 Compose for MySQL DB,但是数据库的当前 sql_mode 设置不允许我运行标准 SQL使用 GROUP BY 语句进行查询。

我从研究中了解到,我需要更改 MySQL 数据库的“sql_mode”配置选项。这是我理解需要执行的mysql语句:

mysql > SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

但是,当我使用我的管理员凭据在我的 mysql 客户端上尝试此操作时,它告诉我我需要超级用户权限,因此我似乎需要 ROOT 登录权限。在 IBM Cloud Dashboard 中,root 登录到数据库的凭据不可用,只有“ADMIN”用户详细信息,显然没有此操作的权限。

总之,我向 IBM Cloud Support 提出的问题是,我需要做什么才能在 Composer for MySQL Database 上启用 GROUP BY 查询? 可以通过composer.json或者其他方法等配置吗?

附言。不要在家尝试这个 - PHPMyAdmin - 所以我有 PHP MyAdmin 访问 IBM Cloud 中的 MySQL 数据库,所以我在那里运行了上面的查询,它使数据库崩溃并使其无法访问。我必须恢复!

---- 部署细节 ------------ 平台:IBM Cloud(又名 Bluemix) 产品 : 为 MySQL 编写 部署详情:键入 MySQL (5.7.20)

【问题讨论】:

  • 请注意,此论坛不是 IBM Cloud 支持。 Stack Overflow 社区可以帮助您解决问题。 IBM 员工以及知识渊博的社区成员随时为您提供帮助。

标签: mysql ibm-cloud compose-db


【解决方案1】:

虽然您不能全局更改 sql_mode(因为它会影响数据库的所有用户),但您可以在每个会话的基础上更改设置。

这是一个简短的例子...

mysql> SELECT name, address, MAX(age) FROM example GROUP BY name;
ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUP BY 
clause and contains nonaggregated column 'compose.example.address' 
which is not functionally dependent on columns in GROUP BY clause; 
this is incompatible with sql_mode=only_full_group_by

这在 SQL92 中是不允许的。如果我们检查...

mysql> select @@SESSION.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 |

1 row in set (0.02 sec)

好的,让我们禁用它...

mysql> SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
Query OK, 0 rows affected (0.02 sec)

mysql> select @@SESSION.sql_mode;
 STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
1 row in set (0.03 sec)

现在我们可以再试一次......

mysql> SELECT name, address, MAX(age) FROM example GROUP BY name;               
Empty set (0.03 sec)

现在我们可以运行命令了。你必须把...

SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

在您想要使用这种 SQL99-later 命令样式的任何会话开始时。

【讨论】:

  • 非常感谢您对我的查询做出非常具体的回答。出色的解决方案和示例演练。最棒的是它就像魅力一样。非常感谢 DJ :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多