使用LIMIT更新SQL中的第一行

时间:2014-09-04 11:42:27

标签: mysql sql limit

我遇到一些看似简单的事情的麻烦。我正在尝试找到第一行满足查询的WHERE部分并更新它。

UPDATE Donation SET Available=0 WHERE Available != 0 and BloodGroup='" + bloodGroup + "' LIMIT 1"

bloodGroup是使用C#自动填充的变量,它保留所选血型的字符串值。

当我尝试运行时,我在'limit'附近得到的语法不正确。

我做错了什么?是否可以在UPDATE查询期间使用LIMIT?

在调试过程中,我得到了这样的查询:

UPDATE Donation SET Available=0 WHERE Available != 0 AND BloodGroup='AB-' LIMIT 1

3 个答案:

答案 0 :(得分:1)

你可以尝试一下吗?获取row_number的方法

UPDATE Donation d1 join (SELECT id,(SELECT @Row:=0) as row,(@Row := @Row + 1) AS row_number FROM Donation where Available <> 0 AND BloodGroup='AB-') d2 
ON d1.id=d2.id
SET d1.Available='three' 
WHERE d1.Available <> 0 AND d1.BloodGroup='AB-' AND d2.row_number='1'

答案 1 :(得分:1)

因为C#经常与SQL Server一起使用,所以问题可能是错误的。 MySQL的语法看起来很好。

在SQL Server中,您可以这样做:

UPDATE TOP (1) Donation
    SET Available = 0
    WHERE Available <> 0 AND BloodGroup = 'AB-';

请注意,这会选择一个任意匹配的行,原始查询也是如此(没有order by)。

答案 2 :(得分:1)

在更新查询中使用限制是不安全的。 请参考  http://bugs.mysql.com/bug.php?id=42415

文档声明任何带有LIMIT子句的UPDATE语句都被认为是不安全的,因为未定义受影响的行的顺序:http://dev.mysql.com/doc/refman/5.1/en/replication-features-limit.html

但是,如果使用“ORDER BY PK”,则会定义行的顺序,并且可以以语句格式记录此类语句,而不会发出任何警告。

您可以在这样的更新查询中使用这种方式限制

    UPDATE messages SET test_read=1
 WHERE id IN (
     SELECT id FROM (
         SELECT id FROM messages 
         ORDER BY date_added DESC  
         LIMIT 5, 5
     ) tmp
 );

还请