Spec-Zone.ru › MySQL 5.7

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 для установки переменных. Они используют оператор присваивания =, но оператор присваивания := также разрешён для этой цели.

  • Присваивание переменных, определённых пользователем

  • Присваивание параметров и локальных переменных

  • Присваивание системных переменных

  • Обработка ошибок 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».

END_OF_DOCUMENT_MARKER
Обработка ошибок 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.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/set-variable.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API