MySQL では、同じクエリで選択したレコードを更新できますか?
たとえば、クエリの場合
SELECT *
FROM `table`
WHERE field = "value"
LIMIT 0,2
2 つの行を返し、同じクエリで、テーブルのフィールドを 1 ずつインクリメントする必要がありますcount
。それは可能ですか?
UPDATE
はい、次のようにクエリとして記述できます。
UPDATE my_table
SET count = count + 1
WHERE field = "value"
LIMIT 2;
またはLIMIT
オフセットを使用して試してください:
UPDATE my_table a
INNER JOIN (SELECT id FROM my_table WHERE field = "value" LIMIT 0, 2) b
ON a.id = b.id
SET count = count + 1;
不可能です。動詞SELECT
はデータを取得するだけです (データを変更せずに)。動詞UPDATE
はデータを変更するだけです (データを取得せずに)。両方のアクションを実行する MySQL 動詞はありません。2 つの別個のステートメントを使用する必要があります。
ただし、これら 2 つのステートメントをトランザクション内にカプセル化して (ストレージ エンジンでサポートされている場合)、アトミックに実行したり、ストアド プロシージャ内から呼び出して、クライアントが発行する必要があるコマンドを簡素化したりすることができます。2つを組み合わせると、次のようになります。
DELIMITER ;;
CREATE PROCEDURE select_and_update(value TEXT)
BEGIN
START TRANSACTION;
SELECT * FROM `table` WHERE field = value LIMIT 0,2;
UPDATE `table` SET count = count + 1 WHERE ...;
COMMIT;
END;;
DELIMITER ;
次に、クライアントは次のことを行うだけで済みます。
CALL select_and_update('value');