IBM Cloud - Compose for MySQL - Измените sql_mode - чтобы включить запросы GROUP BY

Я использую Compose for MySQL DB в моем приложении IBM Cloud CF, однако текущие настройки sql_mode для БД НЕ РАЗРЕШАЮМ мне запускать стандартные SQL-запросы с использованием Оператор GROUP BY.

Из исследования я понял, что мне нужно изменить параметр конфигурации sql_mode для базы данных MySQL. Это оператор mysql, который, как я понимаю, необходимо выполнить:

mysql> УСТАНОВИТЬ ГЛОБАЛЬНЫЙ sql_mode = (ВЫБРАТЬ ЗАМЕНИТЬ (@@ sql_mode, 'ONLY_FULL_GROUP_BY', ''));

Однако, когда я пробую это на моем клиенте mysql, используя свои учетные данные администратора, он сообщает мне, что для этого мне требуются права пользователя SUPER, поэтому, похоже, мне нужен доступ для входа в систему ROOT. Учетные данные для входа в базу данных root недоступны в IBM Cloud Dashboard, только данные пользователя «ADMIN», у которого явно нет прав для этой операции.

В итоге, мой вопрос в службу поддержки IBM Cloud: Что именно мне нужно сделать, чтобы включить запросы GROUP BY в моей базе данных Composer for MySQL? Можно ли его настроить с помощью composer.json или другого метода и т. Д.

PS. НЕ ПЫТАЙТЕСЬ ЭТО ДОМА. - PHPMyAdmin - Итак, у меня был доступ PHP MyAdmin к базе данных MySQL в IBM Cloud, поэтому я выполнил вышеупомянутый запрос, он РАЗБИЛ БД и сделал ее недоступной. Пришлось восстанавливать!

---- ДЕТАЛИ РАЗВЕРТЫВАНИЯ ------------ Платформа: IBM Cloud (также известная как Bluemix) Продукт: Compose for MySQL Сведения о развертывании: Тип MySQL (5.7.20)


person user9354812    schedule 13.02.2018    source источник
comment
Обратите внимание, что этот форум не является службой поддержки IBM Cloud. Сообщество Stack Overflow поможет вам с вашими проблемами. Сотрудники IBM, а также очень осведомленные члены сообщества всегда готовы помочь.   -  person William 'Bill' Wentworth    schedule 13.02.2018


Ответы (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.

person Dj Walker-Morgan    schedule 14.02.2018
comment
Большое спасибо за очень конкретный ответ на мой вопрос. Отличный обзор решений и примеров. Лучше всего это действовало как шарм. Большое спасибо DJ :-) - person user9354812; 20.02.2018