4

ナンセンスな例を挙げて、純粋に理論的な質問があります。

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

さて、バイナリデータが「ギリオンバイト」の場合、プレーンSQLで2回書き込むのを避けたい

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

列フィールドを更新し、同じクエリで列名を使用して再利用したい

または、SELECT でできるように、UPDATE 構文でエイリアスを定義する方法はありますか?

前もって感謝します

(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 ステートメント文字列でデータを 1 回渡すだけで済みます。

于 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ステートメントが非アトミックであるという点で奇妙です。つまり、1 つの列に新しい値が割り当てられるとすぐに、その新しい値が 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私が知っている他のすべてのRBDMSでは...bba

したがって、質問については、 alias を更新する必要はありません。binaryData更新されるとすぐに、更新された値がisBig割り当てステートメントに反映されるためです。

ただし、この動作は非標準であるため、この動作に依存するのはおそらく悪い考えです。

于 2012-08-03T22:55:01.110 に答える