13.7.4.1 Синтаксис SET для присваивания переменных
SET variable = expr [, variable = expr] ...
variable: {
user_var_name
| param_name
| local_var_name
| {GLOBAL | @@GLOBAL.} system_var_name
| [SESSION | @@SESSION. | @@] system_var_name
}
Синтаксис SET для присваивания переменных позволяет назначать значения различным типам переменных, которые влияют на работу сервера или клиентов:
Переменные, определённые пользователем. См. Раздел 9.4, «Переменные, определённые пользователем».
Параметры хранимых процедур и функций, а также локальные переменные хранимых программ. См. Раздел 13.6.4, «Переменные в хранимых программах».
Системные переменные. См. Раздел 5.1.7, «Системные переменные сервера». Системные переменные также могут быть установлены при запуске сервера, как описано в Разделе 5.1.8, «Использование системных переменных».
Оператор SET, который присваивает значения переменным, не записывается в двоичный журнал, поэтому в сценариях репликации он влияет только на хост, на котором он выполняется. Чтобы повлиять на все хосты репликации, выполните оператор на каждом хосте.
В следующих разделах описывается синтаксис SET для установки переменных. Они используют оператор присваивания =, но оператор присваивания := также разрешён для этой цели.
Присваивание переменных, определённых пользователем
Переменные, определённые пользователем, создаются локально внутри сессии и существуют только в контексте этой сессии; см. Раздел 9.4, «Переменные, определённые пользователем».
Переменная, определённая пользователем, записывается как @ и получает значение выражения следующим образом:var_name
SET @var_name = expr;
Примеры:
SET @name = 43;
SET @total_tax = (SELECT SUM(tax) FROM taxable_transactions);
Как показано в этих операторах, expr может варьироваться от простого (литерального значения) до более сложного (значения, возвращаемого скалярным подзапросом).
Таблица Performance Schema user_variables_by_thread содержит информацию о переменных, определённых пользователем. См. Раздел 25.12.10, «Таблицы переменных, определённых пользователем, Performance Schema».
Присваивание параметров и локальных переменных
SET применяется к параметрам и локальным переменным в контексте хранимого объекта, в котором они определены. Следующая процедура использует параметр процедуры increment и локальную переменную counter:
CREATE PROCEDURE p(increment INT)
BEGIN
DECLARE counter INT DEFAULT 0;
WHILE counter < 10 DO
-- ... do work ...
SET counter = counter + increment;
END WHILE;
END;
Присваивание системных переменных
MySQL-сервер поддерживает системные переменные, которые конфигурируют его работу. Системная переменная может иметь глобальное значение, которое влияет на работу сервера в целом, сессионное значение, которое влияет на текущую сессию, или оба. Многие системные переменные динамичны и могут быть изменены во время выполнения с помощью оператора SET, чтобы повлиять на работу текущего экземпляра сервера. (Чтобы сделать установку глобальной системной переменной постоянной, чтобы она применялась после перезапуска сервера, необходимо также установить её в файле настроек.)
Если вы изменяете сессионную системную переменную, значение сохраняется в вашей сессии до тех пор, пока вы не измените переменную на другое значение или сессия не закончится. Изменение не влияет на другие сессии.
Если вы изменяете глобальную системную переменную, значение запоминается и используется для инициализации значения сессии для новых сессий до тех пор, пока вы не измените переменную на другое значение или сервер не завершит работу. Изменение видно любому клиенту, который обращается к глобальному значению. Однако изменение влияет на соответствующее сессионное значение только для клиентов, подключившихся после изменения. Изменение глобальной переменной не влияет на значение сессии для текущих сессий клиентов (даже для сессии, в которой произошло изменение глобального значения).
Установка значения глобальной системной переменной всегда требует специальных привилегий. Установка значения сессионной системной переменной обычно не требует специальных привилегий и может быть выполнена любым пользователем, хотя существуют исключения. Дополнительную информацию см. в Разделе 5.1.8.1, «Привилегии на системные переменные».
Ниже описаны варианты синтаксиса для установки системных переменных:
-
Чтобы присвоить значение глобальной системной переменной, поместите перед именем переменной ключевое слово
GLOBALили квалификатор@@GLOBAL.:SET GLOBAL max_connections = 1000; SET @@GLOBAL.max_connections = 1000;
-
Чтобы присвоить значение сессионной системной переменной, поместите перед именем переменной ключевое слово
SESSIONилиLOCAL, квалификатор@@SESSION.,@@LOCAL.или@@, или вообще не используйте ключевые слова или модификаторы:SET SESSION sql_mode = 'TRADITIONAL'; SET LOCAL sql_mode = 'TRADITIONAL'; SET @@SESSION.sql_mode = 'TRADITIONAL'; SET @@LOCAL.sql_mode = 'TRADITIONAL'; SET @@sql_mode = 'TRADITIONAL'; SET sql_mode = 'TRADITIONAL';
Клиент может изменить свои собственные сессионные переменные, но не переменные других клиентов.
Чтобы установить значение глобальной системной переменной на значение по умолчанию, входящее в состав MySQL, или значение сессионной системной переменной на текущее соответствующее глобальное значение, установите переменную на значение DEFAULT. Например, следующие два оператора идентичны с точки зрения установки сессионного значения max_join_size на текущее глобальное значение:
SET @@SESSION.max_join_size = DEFAULT;
SET @@SESSION.max_join_size = @@GLOBAL.max_join_size;
Для отображения имён и значений системных переменных:
Используйте оператор
SHOW VARIABLES; см. Раздел 13.7.5.39, «Оператор SHOW VARIABLES».Несколько таблиц Performance Schema предоставляют информацию о системных переменных. См. Раздел 25.12.13, «Таблицы системных переменных Performance Schema».
Обработка ошибок SET
Если какое-либо присваивание переменной в операторе SET завершается ошибкой, весь оператор завершается ошибкой, и никакие переменные не изменяются.
Оператор SET генерирует ошибку в описанных ниже случаях. Большинство примеров демонстрируют операторы SET с использованием синтаксиса ключевых слов (например, GLOBAL или SESSION), но принципы также верны для операторов, использующих соответствующие модификаторы (например, @@GLOBAL. или @@SESSION.).
-
Использование
SET(любой вариант) для задания значения только для чтения:mysql>
SET GLOBAL version = 'abc';ERROR 1238 (HY000): Variable 'version' is a read only variable -
Использование
GLOBALдля задания переменной, имеющей только сессионное значение:mysql>
SET GLOBAL sql_log_bin = ON;ERROR 1231 (42000): Variable 'sql_log_bin' can't be set to the value of 'ON' -
Использование
SESSIONдля задания переменной, имеющей только глобальное значение:mysql>
SET SESSION max_connections = 1000;ERROR 1229 (HY000): Variable 'max_connections' is a GLOBAL variable and should be set with SET GLOBAL -
Опускание
GLOBALдля задания переменной, имеющей только глобальное значение:mysql>
SET max_connections = 1000;ERROR 1229 (HY000): Variable 'max_connections' is a GLOBAL variable and should be set with SET GLOBAL Модификаторы
@@GLOBAL.,@@SESSION.и@@применяются только к системным переменным. Попытка применить их к пользовательским переменным, параметрам хранимых процедур или функций, или локальным переменным хранимых программ приводит к ошибке.Не все системные переменные могут быть заданы значением
DEFAULT. В таких случаях присвоение значенияDEFAULTприводит к ошибке.Попытка присвоить значение
DEFAULTпользовательским переменным, параметрам хранимых процедур или функций, или локальным переменным хранимых программ приводит к ошибке.
Присваивание нескольких переменных
Оператор SET может содержать несколько присваиваний переменных, разделенных запятыми. Данный оператор присваивает значение пользовательской переменной и системной переменной:
SET @x = 1, SESSION sql_mode = '';
Если вы задаете несколько системных переменных в одном операторе, для последующих присваиваний без указания ключевого слова используется последнее ключевое слово GLOBAL или SESSION в операторе.
Примеры присваивания нескольких переменных:
SET GLOBAL sort_buffer_size = 1000000, SESSION sort_buffer_size = 1000000;
SET @@GLOBAL.sort_buffer_size = 1000000, @@LOCAL.sort_buffer_size = 1000000;
SET GLOBAL max_connections = 1000, sort_buffer_size = 1000000;
Модификаторы @@GLOBAL., @@SESSION. и @@ применяются только к непосредственно следующей системной переменной, а не к остальным системным переменным. Данный оператор устанавливает глобальное значение sort_buffer_size в 50000, а сессионное значение — в 1000000:
SET @@GLOBAL.sort_buffer_size = 50000, sort_buffer_size = 1000000;
Ссылки на системные переменные в выражениях
Для ссылки на значение системной переменной в выражениях используйте один из модификаторов @@. Например, вы можете получить значения системных переменных в операторе SELECT следующим образом:
SELECT @@GLOBAL.sql_mode, @@SESSION.sql_mode, @@sql_mode;
Ссылка на системную переменную в выражении как @@ (с var_name@@ вместо @@GLOBAL. или @@SESSION.) возвращает сессионное значение, если оно существует, и глобальное значение в противном случае. Это отличается от SET @@, которое всегда ссылается на сессионное значение.var_name =
expr
© 2025 Oracle
Licensed under the GPLv2 License.