我有一个纯粹的理论问题,有一个无意义的例子:
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语法感兴趣)
答案 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中产生b
,b
,但在我知道的其他每个RBDMS中都会产生b
,a
...
因此,对于您的问题,您不需要别名binaryData
,因为更新后,更新后的值将反映在isBig
转让声明中。
然而,依靠这种行为可能是一个坏主意,因为它是非标准的。