• 首页
  • css3教程
  • html5教程
  • jQuery手册
  • vue手册
  • php手册
  • MySQL手册
  • apache手册
  • redis手册
  • 变量分配的SET语法

    SET variable = expr [, variable = expr] ...
    
    variable: {
        user_var_name
      | param_name
      | local_var_name
      | {GLOBAL | @@GLOBAL.} system_var_name
      | {PERSIST | @@PERSIST.} system_var_name
      | {PERSIST_ONLY | @@PERSIST_ONLY.} system_var_name
      | [SESSION | @@SESSION. | @@] system_var_name
    }
    

    SET变量分配的语法使您可以将值分配给影响服务器或客户端操作的不同类型的变量:

    • 用户定义的变量。请参见“用户定义的变量”。
    • 存储过程和函数参数,以及存储程序局部变量。请参见“存储程序中的变量”。
    • 系统变量。请参见“服务器系统变量”。也可以在服务器启动时设置系统变量,如“使用系统变量”中所述。

    一个SET指派变量值不写入二进制日志,语句,以便在复制方案只会影响您在其上执行它的主机。要影响所有复制主机,请在每个主机上执行该语句。

    以下各节介绍SET了设置变量的语法。他们使用=赋值运算符,但是:=为此目的也允许使用赋值运算符。

    • 用户定义的变量分配
    • 参数和局部变量分配
    • 系统变量分配
    • SET错误处理
    • 多变量分配
    • 表达式中的系统变量引用

    用户定义的变量分配

    用户定义的变量在会话中本地创建,并且仅在该会话的上下文中存在;请参见“用户定义的变量”。

    用户定义的变量写为,并为其分配一个表达式值,如下所示:@var_name

    SET @var_name = expr;
    

    例子:

    SET @name = 43;
    SET @total_tax = (SELECT SUM(tax) FROM taxable_transactions);
    

    如这些语句所示,expr范围可以从简单(文字值)到更复杂(标量子查询返回的值)。

    性能架构user_variables_by_thread表包含有关用户定义的变量的信息。请参见“性能模式用户定义的变量表”。

    参数和局部变量分配

    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语句更改以影响当前服务器实例的操作。SET也可以用于将某些系统变量持久保存到mysqld-auto.cnf数据目录中的文件中,以影响后续启动时服务器的操作。

    如果更改会话系统变量,则该值将在会话内保持有效,直到将变量更改为其他值或会话结束为止。该更改对其他会话没有影响。

    如果更改全局系统变量,则该值将被记住并用于初始化新会话的会话值,直到将变量更改为其他值或服务器退出。该更改对访问全局值的所有客户端可见。但是,更改仅影响更改后连接的客户端的相应会话值。全局变量更改不会影响任何当前客户端会话的会话值(甚至不会发生发生全局值更改的会话)。

    要使全局系统变量设置永久生效,以便将其应用于服务器重启,可以将其持久保存到mysqld-auto.cnf数据目录中的文件中。也可以通过手动修改my.cnf选项文件来进行持久性配置更改,但这比较麻烦,并且直到很久以后才可能发现手动输入设置中的错误。SET保留系统变量的语句更加方便,并且避免了格式错误的可能性,因为带有语法错误的设置不会成功,并且不会更改服务器配置。有关持久化系统变量和mysqld-auto.cnf文件的更多信息,请参见“持久性系统变量”。

    注意

    设置或保留全局系统变量值始终需要特殊特权。设置会话系统变量值通常不需要特殊特权,并且任何用户都可以完成,尽管有例外。有关更多信息,请参见“系统变量特权”。

    以下讨论描述了用于设置和保留系统变量的语法选项:

    • 要将值分配给全局系统变量,请在变量名称前加上GLOBAL关键字或@@GLOBAL.限定符:

      SET GLOBAL max_connections = 1000;
      SET @@GLOBAL.max_connections = 1000;
      
    • 要分配一个值到会话系统变量,由前面的变量名SESSIONLOCAL关键字,由@@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';
      

      客户端可以更改其自己的会话变量,但不能更改任何其他客户端的会话变量。

    • 要将全局系统变量持久保存到mysqld-auto.cnf数据目录中的选项文件中,请在变量名称前加上PERSIST关键字或@@PERSIST.限定符:

      SET PERSIST max_connections = 1000;
      SET @@PERSIST.max_connections = 1000;
      

      使用此SET语法,您可以在运行时进行配置更改,这些更改在服务器重新启动后仍然有效。像一样SET GLOBALSET PERSIST设置全局变量运行时值,但还将变量设置写入mysqld-auto.cnf文件(如果存在,则替换任何现有的变量设置)。

    • 要在mysqld-auto.cnf不设置全局变量运行时值的情况下将全局系统变量持久化到文件中,请在变量名称前添加PERSIST_ONLY关键字或@@PERSIST_ONLY.限定符:

      SET PERSIST_ONLY back_log = 100;
      SET @@PERSIST_ONLY.back_log = 100;
      

      喜欢PERSISTPERSIST_ONLY将变量设置写入mysqld-auto.cnf。但是,与不同PERSISTPERSIST_ONLY它不会修改全局变量运行时值。这PERSIST_ONLY适用于配置只能在服务器启动时设置的只读系统变量。

    要将全局系统变量值设置为嵌入式MySQL默认值,或者将会话系统变量设置为当前对应的全局值,请将变量设置为value DEFAULT。例如,以下两个语句在将的会话值设置max_join_size为当前全局值时是相同的:

    SET @@SESSION.max_join_size = DEFAULT;
    SET @@SESSION.max_join_size = @@GLOBAL.max_join_size;
    

    使用SET一个全局系统变量坚持到的值DEFAULT或者它的字面默认值赋给变量的默认值,并增加了一个设定的变量mysqld-auto.cnf。要从文件中删除变量,请使用RESET PERSIST

    某些系统变量无法持久保存或受到持久限制。请参见“非持久性和持久性限制的系统变量”。

    如果在SET执行语句时安装了插件,则可以持久化由插件实现的系统变量。如果仍然安装了插件,则持久化插件变量的分配将在后续服务器重新启动时生效。如果不再安装插件,则服务器读取mysqld-auto.cnf文件时插件变量将不存在。在这种情况下,服务器将警告写入错误日志并继续:

    currently unknown variable 'var_name'
    was read from the persisted config file
    

    要显示系统变量名称和值:

    • 使用SHOW VARIABLES语句;请参见“ SHOW VARIABLES语句”。
    • 几个性能模式表提供了系统变量信息。请参见“性能架构系统变量表”。
    • “性能模式”variables_info表包含的信息显示了最近和何时由哪个用户设置每个系统变量。请参见“性能模式variables_info表”。
    • Performance Schema persisted_variables表提供了该mysqld-auto.cnf文件的SQL接口,从而可以在运行时使用SELECT语句检查其内容。请参见“性能模式persisted_variables表”。

    SET错误处理

    如果语句中的任何变量分配SET失败,则整个语句都会失败,并且不会更改任何变量,也不会mysqld-auto.cnf更改文件。

    SET在此处描述的情况下会产生错误。大多数示例都显示SET使用关键字语法的语句(例如GLOBALSESSION),但是对于使用相应修饰符(例如@@GLOBAL.@@SESSION.)的语句,其原理也适用。

    • 使用SET(任何变体)设置只读变量:

      mysql> SET GLOBAL version = 'abc';
      ERROR 1238 (HY000): Variable 'version' is a read only variable
      
    • 使用的GLOBALPERSISTPERSIST_ONLY设定一个只有一个会话值的变量:

      mysql> SET GLOBAL sql_log_bin = ON;
      ERROR 1228 (HY000): Variable 'sql_log_bin' is a SESSION
      variable and can't be used with SET GLOBAL
      
    • 使用SESSION来设置仅具有全局值的变量:

      mysql> SET SESSION max_connections = 1000;
      ERROR 1229 (HY000): Variable 'max_connections' is a
      GLOBAL variable and should be set with SET GLOBAL
      
    • 遗漏的GLOBALPERSISTPERSIST_ONLY设定一个只有一个全局值的变量:

      mysql> SET max_connections = 1000;
      ERROR 1229 (HY000): Variable 'max_connections' is a
      GLOBAL variable and should be set with SET GLOBAL
      
    • 使用PERSISTPERSIST_ONLY设置不能持久化的变量:

      mysql> SET PERSIST port = 3307;
      ERROR 1238 (HY000): Variable 'port' is a read only variable
      mysql> SET PERSIST_ONLY port = 3307;
      ERROR 1238 (HY000): Variable 'port' is a non persistent read only variable
      
    • @@GLOBAL.@@PERSIST.@@PERSIST_ONLY.@@SESSION.,和@@修饰只适用于系统变量。尝试将其应用于用户定义的变量,存储过程或函数参数或存储的程序局部变量时发生错误。
    • 并非所有系统变量都可以设置为DEFAULT。在这种情况下,分配会DEFAULT导致错误。
    • 尝试分配DEFAULT给用户定义的变量,存储过程或函数参数或存储程序局部变量时发生错误。

    多变量分配

    一条SET语句可以包含多个变量分配,以逗号分隔。该语句将值分配给用户定义的变量和系统变量:

    SET @x = 1, SESSION sql_mode = '';
    

    如果你在一个声明中设置多个系统变量,最近一段时间GLOBALPERSISTPERSIST_ONLY,或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.@@PERSIST.@@PERSIST_ONLY.@@SESSION.,和@@修饰只适用于紧随其后的系统变量,没有任何剩余的系统变量。该语句将sort_buffer_size全局值设置为50000,并将会话值设置为1000000:

    SET @@GLOBAL.sort_buffer_size = 50000, sort_buffer_size = 1000000;
    

    表达式中的系统变量引用

    要在表达式中引用系统变量的值,请使用@@-modifier之一(表达式中不允许的@@PERSIST.和除外@@PERSIST_ONLY.)。例如,您可以在如下SELECT语句中检索系统变量值:

    SELECT @@GLOBAL.sql_mode, @@SESSION.sql_mode, @@sql_mode;
    
    注意

    在表达式中对系统变量的引用as (使用而不是 or或)将返回会话值(如果存在),否则返回全局值。这与始终引用会话值不同。@@var_name@@@@GLOBAL.@@SESSION.SET @@var_name= expr