按顺序更新order by子句,然后选择order by

时间:2014-07-02 10:23:37

标签: mysql

我有一个带有UPDATE子句的ORDER BY查询。我已使用相同的SELECT条款将同一查询复制到ORDER BY,并且我得到了不同的结果。

更新查询:

UPDATE t_locks
SET server_guid = 11028790,
lock_time_to_live = TIMESTAMPADD(MINUTE,5,NOW())
WHERE
(server_guid IS NULL OR NOW() > lock_time_to_live OR lock_time_to_live IS NULL)
AND lock_key_id = 3
ORDER BY flag DESC, last_time_processed ASC
LIMIT 10;

选择查询:

SELECT * FROM t_locks
WHERE
(server_guid IS NULL OR NOW() > lock_time_to_live OR lock_time_to_live IS NULL)
AND lock_key_id = 3
ORDER BY flag DESC, last_time_processed ASC
LIMIT 10;

注意:我没有使用此UPDATE检查SELECT的结果。

怀疑:除了ORDER BY查询中的正常SELECT之外,它还添加了第3个参数ID。我希望UPDATE做同样的事情。

1 个答案:

答案 0 :(得分:0)

SQL数据库不会向order by添加任何内容。有充分理由,SQL没有实现稳定的排序。好的理由是表表示无序集,因此排序顺序没有基线。如果您按常数订购,则无法保证连续两次获得相同的订单。领带可以按任何顺序出现。他们这样做。

您刚学到的内容是基于flaglast_time_processed的重复内容。从您的问题中不清楚您是否有11个或更多具有相同值,或者只有两个位于select的位置10和11,而update位于11和10。

事实证明,SQL Server documentation在解释这个问题(在分页的上下文中)比MySQL做得更好:

  

在查询请求之间实现稳定的结果。 。 。必须满足以下条件:

     

。 。

     
      
  1. ORDER BY子句包含保证唯一的列或列组合。
  2.