MySQL的更新
我有一个纯理论问题,用废话例如: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语法)
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;
会导致b
,b
在MySQL,但是b
,a
中,我所知道的所有其他RBDMS ...
因此,对于你的问题,您不需要别名binaryData
,因为它一经更新,更新后的值将反映在isBig
赋值语句中。
但是,依靠这种行为可能是一个坏主意,因为它是非标准的。
可以使用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语句字符串中传入一次数据即可。
也谢谢替代:) – skyline26 2012-08-03 23:02:49
请记住,这将始终创建磁盘上的myisam临时表... – 2012-08-03 23:16:32
你可以使用一个用户变量:
set @content = '___GIANT_BINARY_DATA___';
UPDATE mytable
SET binaryData = @content,
isBig = LENGTH(@content) > 1000000000
WHERE id = 22;
set @content = NULL; -- free up memory
谢谢!那么SET的顺序很重要。谢谢! – skyline26 2012-08-03 23:02:02
虽然不帮助INSERT。 – 2012-08-03 23:04:18
@JustinSwanhart真的......我认为插入可以用你的建议或类似于Zane的东西来处理。我没有评论它,因为你们已经很好地覆盖了它... – 2012-08-03 23:13:32