4

我有一个纯粹的理论问题,有一个废话的例子:

  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 语法感兴趣)

4

3 回答 3

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

于 2012-08-03T22:51:27.037 回答
1

您可以使用用户变量:

set @content = '___GIANT_BINARY_DATA___';
UPDATE mytable
   SET binaryData = @content,
       isBig = LENGTH(@content) > 1000000000
 WHERE id = 22;
set @content = NULL; -- free up memory
于 2012-08-03T22:53:47.413 回答
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 中......

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

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

于 2012-08-03T22:55:01.110 回答