mysql 如何在update语句中设置局部变量(语法?)

a6b3iqyw  于 2023-05-05  发布在  Mysql
关注(0)|答案(6)|浏览(235)

如何在执行Update语句时设置变量?我看不懂语法。
所以我想要下面这样的东西,但它说语法是错误的:

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

polkgigr1#

这是可能的:-

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

设置整数(非增量)

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

w8f9ii692#

如果你想得到这样的东西:
SET @tempVariable := 0; UPDATE myTable SET col1 = 5, col2 = @tempVariable, @tempVariable := 100;
你可以这样做一个技巧:

  • 创建列值。

ALTER TABLE Proj ADD col3 numeric;

  • 给予col 3一个值来设置你需要的变量(@tempVariable)。

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

  • 删除col 3

ALTER TABLE Proj DROP col3;
通过这种方式,您可以在不更改表属性的情况下为变量赋值。它在设置动态值时非常有用。
例如:@tempVariable := @otherVariable + 100;

vlurs2pr

vlurs2pr3#

关键是“:=”运算符。MySQL User Variable
也可以在SET以外的语句中为用户变量赋值。在这种情况下,赋值运算符必须是:=和not =,因为后者在非SET语句中被视为比较运算符=:
1使用更新列中的一个

SET @tempVariable := 0;

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

**@tempVariable总是100,col 3总是101。似乎mySQL将使用新分配的值而不是表中的原始值。这与MS SQL不同。**为了更清楚地说明,尝试以下示例,col 3和@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和col 3将具有相同的值。它们将是col 4原始值+1。

yyhrrdl8

yyhrrdl84#

我使用select测试了一个类似的查询,它对我很有效,因此我将按如下方式重写您的查询

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

x759pob25#

对于更复杂的公式,使用结果列作为临时存储区会很方便:

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 
)
m528fe3b

m528fe3b6#

我设法在不使用额外临时列的情况下设置多个变量,方法是在IF()中设置它们,其中有多个条件都必须进行评估,并使用这些条件设置一个随机列(例如PK)。
例如,我需要在UPDATE语句中设置3个变量,以将字符串拆分为2个(结合一些条件):

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

我通过将id列设置为自身来实现这一点,并将其 Package 在一个IF()中,在该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

相关问题