mysql更新字段及其后续使用

时间:2012-08-03 22:38:41

标签: mysql sql

我有一个纯粹的理论问题,有一个无意义的例子:

  UPDATE mytable
      binaryData = '___GIANT_BINARY_DATA___',
      isBig      = LENGTH('___THE_SAME_GIANT_BINARY_DATA___') > 1000000000
  WHERE id = 22

现在,如果我的二进制数据是“gillion bytes”,我想避免在普通SQL中写两次

  UPDATE mytable
      binaryData = '___GIANT_BINARY_DATA___',
      isBig      = LENGTH(binaryData) > 1000000000
  WHERE id = 22

我想更新列字段,然后在同一查询中使用其列名重新使用

或者有没有办法在UPDATE语法中定义别名,就像我可以用SELECT做的那样?

提前谢谢

(p.s。我也对等效的INSERT语法感兴趣)

3 个答案:

答案 0 :(得分:2)

您可以像CROSS JOIN那样使用:

UPDATE     mytable a
CROSS JOIN (SELECT '__GIANT_BINARY_DATA__' AS bindata) b
SET        a.binaryDate = b.bindata,
           a.isBig = LENGTH(b.bindata) > 1000000000
WHERE      a.id = 22

这将允许您访问每一行中的相同值,并且您只需在SQL语句字符串中传入一次数据。

答案 1 :(得分:1)

您可以使用用户变量:

set @content = '___GIANT_BINARY_DATA___';
UPDATE mytable
   SET binaryData = @content,
       isBig = LENGTH(@content) > 1000000000
 WHERE id = 22;
set @content = NULL; -- free up memory

答案 2 :(得分:1)

MySql是一个奇怪的问题,因为SET语句是非原子的,这意味着只要为一个列分配了一个新值,如果在update语句的其他地方使用了该值,则会反映该值。

以下陈述:

CREATE TABLE Swap (
  a CHAR(1),
  b CHAR(1)
);

INSERT INTO Swap (a, b) VALUES ('a', 'b');

UPDATE Swap SET a = b, b = a;

SELECT * FROM Swap;

会在MySql中产生bb,但在我知道的其他每个RBDMS中都会产生ba ...

因此,对于您的问题,您不需要别名binaryData,因为更新后,更新后的值将反映在isBig转让声明中。

然而,依靠这种行为可能是一个坏主意,因为它是非标准的。