SET
Syntax
SET variable_assignment [, variable_assignment] ... variable_assignment: user_var_name = expr | [GLOBAL | SESSION] system_var_name = expr | [@@global. | @@session. | @@]system_var_name = expr
Contents
One can also set a user variable in any expression with this syntax:
user_var_name:= expr
Description
The SET
statement assigns values to different types of variables that affect the operation of the server or your client. Older versions of MySQL employed SET OPTION
, but this syntax was deprecated in favor of SET
without OPTION
, and was removed in MariaDB 10.0.
Changing a system variable by using the SET statement does not make the change permanently. To do so, the change must be made in a configuration file.
For setting variables on a per-query basis (from MariaDB 10.1.2), see SET STATEMENT
.
See SHOW VARIABLES
for documentation on viewing server system variables.
See Server System Variables for a list of all the system variables.
GLOBAL / SESSION
When setting a system variable, the scope can be specified as either GLOBAL or SESSION.
A global variable change affects all new sessions. It does not affect any currently open sessions, including the one that made the change.
A session variable change affects the current session only.
If the variable has a session value, not specifying either GLOBAL or SESSION will be the same as specifying SESSION. If the variable only has a global value, not specifying GLOBAL or SESSION will apply to the change to the global value.
DEFAULT
Setting a global variable to DEFAULT will restore it to the server default, and setting a session variable to DEFAULT will restore it to the current global value.
Examples
- innodb_sync_spin_loops is a global variable.
- skip_parallel_replication is a session variable.
- max_error_count is both global and session.
SELECT VARIABLE_NAME, SESSION_VALUE, GLOBAL_VALUE FROM INFORMATION_SCHEMA.SYSTEM_VARIABLES WHERE VARIABLE_NAME LIKE 'max_error_count' OR VARIABLE_NAME LIKE 'skip_parallel_replication' OR VARIABLE_NAME LIKE 'innodb_sync_spin_loops'; +---------------------------+---------------+--------------+ | VARIABLE_NAME | SESSION_VALUE | GLOBAL_VALUE | +---------------------------+---------------+--------------+ | MAX_ERROR_COUNT | 64 | 64 | | SKIP_PARALLEL_REPLICATION | OFF | NULL | | INNODB_SYNC_SPIN_LOOPS | NULL | 30 | +---------------------------+---------------+--------------+
Setting the session values:
SET max_error_count=128;Query OK, 0 rows affected (0.000 sec) SET skip_parallel_replication=ON;Query OK, 0 rows affected (0.000 sec) SET innodb_sync_spin_loops=60; ERROR 1229 (HY000): Variable 'innodb_sync_spin_loops' is a GLOBAL variable and should be set with SET GLOBAL SELECT VARIABLE_NAME, SESSION_VALUE, GLOBAL_VALUE FROM INFORMATION_SCHEMA.SYSTEM_VARIABLES WHERE VARIABLE_NAME LIKE 'max_error_count' OR VARIABLE_NAME LIKE 'skip_parallel_replication' OR VARIABLE_NAME LIKE 'innodb_sync_spin_loops'; +---------------------------+---------------+--------------+ | VARIABLE_NAME | SESSION_VALUE | GLOBAL_VALUE | +---------------------------+---------------+--------------+ | MAX_ERROR_COUNT | 128 | 64 | | SKIP_PARALLEL_REPLICATION | ON | NULL | | INNODB_SYNC_SPIN_LOOPS | NULL | 30 | +---------------------------+---------------+--------------+
Setting the global values:
SET GLOBAL max_error_count=256; SET GLOBAL skip_parallel_replication=ON; ERROR 1228 (HY000): Variable 'skip_parallel_replication' is a SESSION variable and can't be used with SET GLOBAL SET GLOBAL innodb_sync_spin_loops=120; SELECT VARIABLE_NAME, SESSION_VALUE, GLOBAL_VALUE FROM INFORMATION_SCHEMA.SYSTEM_VARIABLES WHERE VARIABLE_NAME LIKE 'max_error_count' OR VARIABLE_NAME LIKE 'skip_parallel_replication' OR VARIABLE_NAME LIKE 'innodb_sync_spin_loops'; +---------------------------+---------------+--------------+ | VARIABLE_NAME | SESSION_VALUE | GLOBAL_VALUE | +---------------------------+---------------+--------------+ | MAX_ERROR_COUNT | 128 | 256 | | SKIP_PARALLEL_REPLICATION | ON | NULL | | INNODB_SYNC_SPIN_LOOPS | NULL | 120 | +---------------------------+---------------+--------------+
SHOW VARIABLES will by default return the session value unless the variable is global only.
SHOW VARIABLES LIKE 'max_error_count'; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | max_error_count | 128 | +-----------------+-------+ SHOW VARIABLES LIKE 'skip_parallel_replication'; +---------------------------+-------+ | Variable_name | Value | +---------------------------+-------+ | skip_parallel_replication | ON | +---------------------------+-------+ SHOW VARIABLES LIKE 'innodb_sync_spin_loops'; +------------------------+-------+ | Variable_name | Value | +------------------------+-------+ | innodb_sync_spin_loops | 120 | +------------------------+-------+
Using the inplace syntax:
SELECT (@a:=1); +---------+ | (@a:=1) | +---------+ | 1 | +---------+ SELECT @a; +------+ | @a | +------+ | 1 | +------+
原文:https://mariadb.com/kb/en/set/
tag1:【系統變量】
0.系統變量是mysql啓動時需要初始化的具有某種特定功能的變量,如error_log系統變量定義了錯誤日誌是否記錄。系統變量可以認爲有2種形式,一種是系統全局變量(system global variables),一種是系統會話變量(system session variables)。有的系統變量只有全局變量,沒有會話變量形式,那麼此時會話變量的取值默認就是系統變量的默認值。
1.系統全局變量與系統會話變量的影響範圍,系統全局變量是設置後對所有的新產生的會話產生影響(新會話的系統全局變量和系統會話變量都會變爲最新的系統全局變量值)。系統會話變量,僅僅對當前用戶的當前會話的系統會話變量產生影響。
2.系統會話變量的修改,僅僅對當前用戶的當前會話的系統會話變量產生影響,set (session) 系統變量名 = 變量值,對當前會話的global 系統變量名的值不產生影響,同理,set global 系統變量名,對當前會話的系統會話變量名不產生影響,但set global 系統變量名會對新建立的會話的global系統變量和session系統變量構成影響。使用set修改系統變量只是動態修改,比如set global error_log = on;設置後,mysql重啓後該修改會丟失,mysql啓動時會加載配置文件如/etc/my.cnf中的系統變量預置值作爲系統變量的初始值。
3.系統變量的作用原理,同一個系統變量,有的同時有系統會話變量值和系統全局變量值(分別存儲在global_variables和session_variables表中),有的只有系統全局變量,沒有系統會話變量(此時當前會話的當前系統會話變量的值默認效果就是該全局變量的值的效果)。我們知道某個系統變量對系統的實際作用是通過系統會話變量爲準的,比如error_log選項變量,如果系統全局變量值與系統會話變量值不同那麼當前會話以系統會話變量值的效果爲準,比如error_log的系統會話變量值是錯誤日誌是否開啓的標誌。
tag2:【用戶變量】
0.用戶變量就是用戶自定義的變量,區別於系統變量。
1.用戶變量一般分爲用戶會話變量和用戶局部變量。
2.用戶會話變量,僅僅在整個會話有效期內有效,可以在程序任何地方修改定義。定義方法爲set @變量名=變量值;如set @var1=2;select @var2;僅僅在當前會話中有效。當前會話結束則變量銷燬。與系統會話變量的定義修改方式基本一樣。
3.用戶局部變量,用戶局部變量只能在某種特殊代碼塊中定義。 a:用戶局部變量僅僅在當前會話有效。b:用戶局部變量僅僅在某個程序段內部有效,其它地方無效,而不是像用戶會話變量那樣,在任意地方都可以定義和修改(通過set @變量名,如set @var1=44;),定義用戶局部變量需要在某種特殊的區域中,如procedure內部(如果非特殊區域內只能定義和修改用戶自定義的用戶局部變量,報ERROR 1054 (42S22): Unknown column 'd' in 'field list'錯誤)。比如我們在一個procedure中set var1=2;select var1;procedure中定義的會話變量也叫做過程變量procedure variables,是用戶局部變量的一種,這種變量僅僅在call調用當前procedure時候有效,調用結束過程變量銷燬。但是在procedure中定義和修改的用戶會話變量仍然是全局有效的。用戶局部變量類似於php的函數內定義的變量。
案例:
CREATE PROCEDURE prc_test ()
BEGIN
DECLARE var2 INT DEFAULT 1;
SET var2 := var2 + 1;
SET @var2 := @var2 + 1;
SELECT var2, @var2;
END;
SET @var2 = 1;
CALL prc_test();
var2 @var2
--- ---
2 2
CALL prc_test();
var2 @var2
--- ---
2 3
CALL prc_test();
var2 @var2
--- ---
2 4
歡迎加我們微信wang1415035017進入微信高級技術羣共同進步,或者掃碼加入我們哦(V_V)