2

更新された行を選択する簡単な方法はありますか?

長い間読み取られなかったデータを削除できるように、行を読み取るたびにタイムスタンプを保存しようとしています。

最初にSELECTクエリを実行してみましたが、少し遅いですが、次のような単純な解決策も見つかりました

 UPDATE foo AS t, (SELECT id FROM foo WHERE statement=1)q
 SET t.time=NOW() WHERE t.id=q.id

しかし、私はまだこれを行うための通常の方法を見つけたいと思っています。

また、最初に時間を更新してから、更新された行を選択する方がはるかに簡単だと思いますが、これでも何も見つかりませんでした

4

4 に答える 4

3

MySQLの単一行 UPDATEの場合、次のことができます。

UPDATE foo
SET    time = NOW()
WHERE  statement = 1
AND    @var := id

@var := idは常にですが、更新前にの値を変数@varにTRUE書き込みます。次に、次のことができます。id

SELECT @var;

PostgreSQLでは、RETURNINGを使用できます。
OracleにもRETURNINGがあります。
SQL-ServerにはOUTPUTがあります。
しかし、MySQLにはそのようなものはありません。

于 2013-02-22T22:34:56.807 に答える
2

time次のように列を宣言します。

CREATE TABLE foo (
    ...
    time TIMESTAMP ON UPDATE CURRENT_TIMESTAMP(),
    ...)

その後、行が更新されるたびに、列が自動的に更新されます。

アップデート:

SELECT中に自動的に更新する方法はないと思うので、次の2つの手順で更新する必要があります。

UPDATE foo
SET time = NOW()
WHERE <conditions>;

SELECT <columns>
FROM foo
WHERE <conditions>;

列が含まれていない限り、timeこれは機能するはずです。安全性を最大限に高めるには、トランザクションを使用して、他のクエリが干渉しないようにする必要があります。

于 2013-02-22T22:27:54.043 に答える
1

@Erwin Brandstetter:CONCAT_WS()複数のIDを取得するためにユーザー変数を使用する戦略を拡張することは難しくありません。 申し訳ありませんが、まだコメントを追加できません...

于 2013-02-23T02:45:39.307 に答える
0

ここで提案されているように、変更された主キーを抽出して、後でタイムスタンプ列を更新できます。

SET @uids := null;
UPDATE footable
   SET foo = 'bar'
 WHERE fooid > 5
   AND ( SELECT @uids := CONCAT_WS(',', fooid, @uids) );
SELECT @uids;

https://gist.github.com/PieterScheffers/189cad9510d304118c33135965e9cddbから

SELECT @uids;したがって、結果の値を分割して、finalをupdateステートメントに置き換える必要があり@uidsます(変更されたすべてのIDを含むvarcharを)で除算し,ます。

于 2021-06-27T20:27:28.947 に答える