如何在 MySQL 或 Sequelize 中禁用 only_full_group_by
How to disable only_full_group_by in MySQL or Sequelize
在 Sequelize 中,我将如何做相当于 SET sql_mode=''
的操作来避免出现以下错误?
SequelizeDatabaseError: ER_WRONG_FIELD_WITH_GROUP: Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'assets.group_id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
或者,我如何更改 MySQL 的默认配置,使 sql_mode
始终为 ''
?
谢谢!
试试这个:
SET GLOBAL sql_mode = '';
获取现有 sql_mode 并仅删除 ONLY_FULL_GROUP_BY
值而不是将其完全清空。
SELECT @@sql_mode; -- Get the current sql_mode
您可能会得到如下结果;
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
现在从结果中删除 ONLY_FULL_GROUP_BY
并更新 sql_mode
SET GLOBAL sql_mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION";
SET SESSION sql_mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION";
大功告成。
请注意,SET GLOBAL 是更新全局设置,在您重新启动 mysql 服务器或服务后才会生效。
即使不重新启动 mysql 服务器,SET SESSION 也会立即对您的当前会话产生影响。因此,您可以根据需要使用其中之一或两者。
或者,从 MySQL 5.7 开始,您可以通过对抛出错误的字段使用 ANY_VALUE
函数来简单地修改查询,而不是禁用此设置。例如,您发布的错误消息中提到的 ANY_VALUE(assets.group_id)
。
看了其他答案后,
请注意 如果您更改 sql_mode,它不会影响存储过程。 sql_mode 与 SP 本身一起存储,因此您需要在 sql_mode 更改
之后 删除并再次执行 SP
在 Sequelize 中,我将如何做相当于 SET sql_mode=''
的操作来避免出现以下错误?
SequelizeDatabaseError: ER_WRONG_FIELD_WITH_GROUP: Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'assets.group_id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
或者,我如何更改 MySQL 的默认配置,使 sql_mode
始终为 ''
?
谢谢!
试试这个:
SET GLOBAL sql_mode = '';
获取现有 sql_mode 并仅删除 ONLY_FULL_GROUP_BY
值而不是将其完全清空。
SELECT @@sql_mode; -- Get the current sql_mode
您可能会得到如下结果;
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
现在从结果中删除 ONLY_FULL_GROUP_BY
并更新 sql_mode
SET GLOBAL sql_mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION";
SET SESSION sql_mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION";
大功告成。
请注意,SET GLOBAL 是更新全局设置,在您重新启动 mysql 服务器或服务后才会生效。 即使不重新启动 mysql 服务器,SET SESSION 也会立即对您的当前会话产生影响。因此,您可以根据需要使用其中之一或两者。
或者,从 MySQL 5.7 开始,您可以通过对抛出错误的字段使用 ANY_VALUE
函数来简单地修改查询,而不是禁用此设置。例如,您发布的错误消息中提到的 ANY_VALUE(assets.group_id)
。
看了其他答案后, 请注意 如果您更改 sql_mode,它不会影响存储过程。 sql_mode 与 SP 本身一起存储,因此您需要在 sql_mode 更改
之后 删除并再次执行 SP