MySql 如何在更新语句中设置局部变量(语法?)

问题描述 投票:0回答:6

如何在执行 Update 语句时设置变量?我似乎无法弄清楚语法。

所以我想要下面这样的东西,但它说语法错误:

SET @tempVariable := 0;
UPDATE myTable SET col1 = 5, col2 = @tempVariable, @tempVariable := 100;
mysql sql syntax
6个回答
29
投票

这是可能的:-

 UPDATE myTable SET col1 = 5,
 col2 = (@tempVariable:=@tempVariable+1) // to increment

设置一个整数(不是增量)

 UPDATE myTable SET col1 = 5, 
 col2 = (@tempVariable:=100) // to assign any integer

6
投票

如果你想获得这样的东西:

SET @tempVariable := 0;
UPDATE myTable SET col1 = 5, col2 = @tempVariable, @tempVariable := 100;

你可以这样做:

  • 创建列值。

ALTER TABLE Proj ADD col3 numeric;

  • 给 col3 一个值以设置你需要的变量(@tempVariable)。

SET @tempVariable := 0;
UPDATE myTable SET col1 = 5, col2 = @tempVariable, col3 = @tempVariable := 100;

  • 放下col3

ALTER TABLE Proj DROP col3;

通过这种方式,您可以在不更改表属性的情况下为变量赋值。它在设置动态值时非常有用。

例如:

@tempVariable := @otherVariable + 100;


5
投票

关键是“:=”运算符。 MySQL 用户变量

您还可以在其他语句中为用户变量赋值 比SET。在这种情况下,赋值运算符必须是 := 而不是 = 因为后者在非 SET 中被视为比较运算符 = 声明:

1 使用更新列之一

SET @tempVariable := 0;

UPDATE myTable 
SET col1 = 5, 
    col2 = @tempVariable := 100, 
    col3 = @tempVariable := col2 + 1;

@tempVariable 始终为 100,col3 将始终为 101。似乎 mySQL 将使用新分配的值而不是表中的原始值。这与 MS SQL 不同。 为了更清楚,请尝试以下示例,col3 和 @tempVariable 的值将为 1001。

UPDATE myTable 
SET col1 = 5, 
    col2 = @tempVariable := 100, 
    col2 = 1000
    col3 = @tempVariable := col2 + 1;

2 使用表中除更新列之外的其他列。

UPDATE myTable 
SET col1 = 5, 
    col2 = @tempVariable := 100, 
    col3 = @tempVariable := col4 + 1;

@tempVariable 和 col3 将具有相同的值。它们将是 col4 原始值 + 1。


1
投票

我使用 select 测试了一个类似的查询,它对我有用,所以我会按如下方式重写您的查询

SET @tempVariable := 0;
UPDATE myTable SET col1 = 5, col2 = (SELECT @tempVariable + 100);

0
投票

对于更复杂的公式,使用结果列作为临时存储就派上用场了:

UPDATE `myTable` join (SELECT @tempVariable := -1) a
SET `col2` = @tempVariable := @tempVariable + 1, `col2` = (SELECT 
CASE 
    WHEN MOD(@tempVariable,3) =0 THEN '1 of 3'
    WHEN MOD(@tempVariable,3) =1 THEN '2 of 3'
    WHEN MOD(@tempVariable,3) =2 THEN '3 of 3'
END 
)

0
投票

好的!

我设法在不使用额外临时列的情况下设置多个变量,方法是将它们设置在具有多个条件的

IF()
中,所有条件都必须进行评估,并使用它来为自己设置一个随机列(例如PK)。

例如我需要在

UPDATE
语句中设置3个变量来将一个字符串拆分为2个(结合一些条件):

SET @trimmed='';
SET @firstPart='';
SET @firstSpace='';

我通过将

id
列设置为自身来做到这一点,包裹在填充变量的
IF()
中:

UPDATE `myTable`
SET 
  `id` = IF(
  ((@trimmed:=TRIM(`code_and_note`)) OR TRUE) AND 
  ((@firstSpace:=LOCATE(' ',@trimmed)) OR TRUE) AND 
  (@firstPart:=IF(@firstSpace=0, '', SUBSTRING(@trimmed, 1, @firstSpace))),
    `id`,
    `id`
  ),
  ...

你需要

OR TRUE
分配在一起,否则如果一个评估为 FALSE,它们将不会全部分配。

然后您可以在后面的列分配中使用变量:

UPDATE `myTable`
SET 
  `id` = IF(...),
  `code` = IF(LENGTH(@trimmed) >= 10 AND @firstSpace = 0, @trimmed, IF(LENGTH(@firstPart) >= 10, @firstPart, '')),
  `note` = IF(LENGTH(@trimmed) >= 10 AND @firstSpace = 0, '', IF(LENGTH(@firstPart) >= 10, SUBSTRING(@trimmed, @firstSpace + 1), @trimmed));

在此处查看有效的 DB Fiddle:https://www.db-fiddle.com/f/4UeH69PQdse1hUb9tyeGPc/0

© www.soinside.com 2019 - 2024. All rights reserved.