2012-08-03 101 views
4

我有一个纯理论问题,用废话例如:MySQL的更新

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

现在,如果我的二进制数据是“吉联字节”,我想避免它写两次在普通的SQL

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

我想更新一列字段,然后重新使用它,使用它的列名,在同一个查询

也许是重新在UPDATE语法中定义别名的方法,就像我可以用SELECT做的一样?

预先感谢您

(PS我也很感兴趣,等效INSERT语法)

回答

1

MySQL是在一个古怪的SET陈述非原子,这意味着只要一列被分配一个新的价值,新的值将是反映在更新声明中的其他地方是否使用它。

下面的语句:

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; 

会导致bb在MySQL,但是ba中,我所知道的所有其他RBDMS ...

因此,对于你的问题,您不需要别名binaryData,因为它一经更新,更新后的值将反映在isBig赋值语句中。

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

+0

谢谢!那么SET的顺序很重要。谢谢! – skyline26 2012-08-03 23:02:02

+0

虽然不帮助INSERT。 – 2012-08-03 23:04:18

+0

@JustinSwanhart真的......我认为插入可以用你的建议或类似于Zane的东西来处理。我没有评论它,因为你们已经很好地覆盖了它... – 2012-08-03 23:13:32

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语句字符串中传入一次数据即可。

+0

也谢谢替代:) – skyline26 2012-08-03 23:02:49

+0

请记住,这将始终创建磁盘上的myisam临时表... – 2012-08-03 23:16:32

1

你可以使用一个用户变量:

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