如何在执行 Update 语句时设置变量?我似乎无法弄清楚语法。
所以我想要下面这样的东西,但它说语法错误:
SET @tempVariable := 0;
UPDATE myTable SET col1 = 5, col2 = @tempVariable, @tempVariable := 100;
这是可能的:-
UPDATE myTable SET col1 = 5,
col2 = (@tempVariable:=@tempVariable+1) // to increment
设置一个整数(不是增量)
UPDATE myTable SET col1 = 5,
col2 = (@tempVariable:=100) // to assign any integer
如果你想获得这样的东西:
SET @tempVariable := 0;
UPDATE myTable SET col1 = 5, col2 = @tempVariable, @tempVariable := 100;
你可以这样做:
ALTER TABLE Proj ADD col3 numeric;
SET @tempVariable := 0;
UPDATE myTable SET col1 = 5, col2 = @tempVariable, col3 = @tempVariable := 100;
ALTER TABLE Proj DROP col3;
通过这种方式,您可以在不更改表属性的情况下为变量赋值。它在设置动态值时非常有用。
例如:
@tempVariable := @otherVariable + 100;
关键是“:=”运算符。 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。
我使用 select 测试了一个类似的查询,它对我有用,所以我会按如下方式重写您的查询
SET @tempVariable := 0;
UPDATE myTable SET col1 = 5, col2 = (SELECT @tempVariable + 100);
对于更复杂的公式,使用结果列作为临时存储就派上用场了:
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
)
好的!
我设法在不使用额外临时列的情况下设置多个变量,方法是将它们设置在具有多个条件的
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