我遇到一些看似简单的事情的麻烦。我正在尝试找到第一行满足查询的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
答案 0 :(得分:1)
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
);
还请