选择受更新影响的行

时间:2010-07-02 07:22:36

标签: sql mysql atomic

如何在MySQL中获取受SQL UPDATE语句影响的确切行?

我在许多计算机上有许多客户端可以随时根据WHERE子句更新同一个表中的行,并且每个客户端需要在另一个系统中为它们影响的每一行执行某些操作,因此获取受影响的物品清单必须准确,不易受到竞争条件的影响。

某些数据库支持UPDATE ... OUTPUT UPDATED.id WHERE ...,例如SQL Server

如何在MySQL中执行此原子UPDATE / SELECT

(我已经看到了先建立SELECT,然后在IN中将ID用作UPDATE子句的建议。但是另一个客户端可能会运行相同的SELECT并在第一个客户端排队其UPDATE等时检索相同的行?)

2 个答案:

答案 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。这只适用于单行更新。