如何在MySQL中获取受SQL UPDATE
语句影响的确切行?
我在许多计算机上有许多客户端可以随时根据WHERE
子句更新同一个表中的行,并且每个客户端需要在另一个系统中为它们影响的每一行执行某些操作,因此获取受影响的物品清单必须准确,不易受到竞争条件的影响。
某些数据库支持UPDATE ... OUTPUT UPDATED.id WHERE ...
,例如SQL Server
如何在MySQL中执行此原子UPDATE
/ SELECT
?
(我已经看到了先建立SELECT
,然后在IN
中将ID用作UPDATE
子句的建议。但是另一个客户端可能会运行相同的SELECT
并在第一个客户端排队其UPDATE
等时检索相同的行?)
答案 0 :(得分:2)
使用表锁定或事务(如果存储引擎支持)以防止竞争条件。
LOCK TABLES tablename;
SELECT * FROM tablename WHERE x.
do something else
UPDATE tablename SET y WHERE x.
UNLOCK TABLES
答案 1 :(得分:1)
这是我之前使用的,有一个其他人使用它的实例here on Stackoverflow:
UPDATE my_table SET
id = (SELECT @id := id),
<column> = 'value'
WHERE <condition>;
@id
将包含更新行的ID,如果没有更新行,则为NULL
。这只适用于单行更新。