MySQL 8.3 Release Notes
-
赋值运算符。使左侧的用户变量取右侧的值。右侧的值可以是文字值、另一个存储值的变量或任何合法的标量值表达式,包括查询结果(只要是标量值)。您可以在同一个
SET
语句中执行多个赋值操作。与
=
不同,:=
运算符永远不会被解释为比较运算符。这意味着您可以在任何有效的 SQL 语句中使用:=
运算符来赋值变量(不仅仅是在SET
语句中)。mysql> SELECT @var1, @var2; -> NULL, NULL mysql> SELECT @var1 := 1, @var2; -> 1, NULL mysql> SELECT @var1, @var2; -> 1, NULL mysql> SELECT @var1, @var2 := @var1; -> 1, 1 mysql> SELECT @var1, @var2; -> 1, 1 mysql> SELECT @var1:=COUNT(*) FROM t1; -> 4 mysql> SELECT @var1; -> 4
您可以在其他语句中使用
:=
运算符来赋值,例如UPDATE
语句,如下所示:mysql> SELECT @var1; -> 4 mysql> SELECT * FROM t1; -> 1, 3, 5, 7 mysql> UPDATE t1 SET c1 = 2 WHERE c1 = @var1:= 1; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> SELECT @var1; -> 1 mysql> SELECT * FROM t1; -> 2, 3, 5, 7
虽然您可以在单个 SQL 语句中使用
:=
运算符来同时设置和读取同一个变量的值,但这不是推荐的做法。第 11.4 节,「用户定义变量」 解释了为什么您应该避免这样做。 -
该运算符用于在两个情况下执行值赋值,如下两段所述。
在
SET
语句中,=
被视为赋值运算符,导致左侧的用户变量采用右侧的值。(换言之,在SET
语句中,=
与:=
被视为相同。)右侧的值可以是文字值、另一个存储值的变量或任何产生标量值的合法表达式,包括查询结果(只要该值是标量值)。您可以在同一个SET
语句中执行多个赋值。在
SET
子句中UPDATE
语句中,=
也作为赋值运算符;在这种情况下,它使左侧的列名采用右侧的值,前提是UPDATE
语句中的任何WHERE
条件都被满足。您可以在同一个SET
子句中执行多个赋值。在其他任何上下文中,
=
被视为 比较运算符。mysql> SELECT @var1, @var2; -> NULL, NULL mysql> SELECT @var1 := 1, @var2; -> 1, NULL mysql> SELECT @var1, @var2; -> 1, NULL mysql> SELECT @var1, @var2 := @var1; -> 1, 1 mysql> SELECT @var1, @var2; -> 1, 1
有关更多信息,请参阅 第 15.7.6.1 节,“SET 变量赋值语法”、第 15.2.17 节,“UPDATE 语句” 和 第 15.2.15 节,“子查询”。