在MySQL中使用LIMIT 1

时间:2011-05-07 21:29:25

标签: mysql

什么时候在MySQL中查询结尾处添加LIMIT 1是合适的。我通常在DELETE中添加它,但我已经看到它与INSERT a甚至UPDATE一起使用。这是一种矫枉过正还是一种好习惯?

5 个答案:

答案 0 :(得分:37)

 INSERT INTO .. VALUES () LIMIT 1

不存在。希望你知道你放了多少VALUES()!

 INSERT INTO .. SELECT ... LIMIT 1

确实存在且非常有用,并且因为LIMIT在SELECT上而非主题。

 DELETE ... LIMIT 1
 UPDATE ... LIMIT 1

极少有用。要么你知道你的数据库足以确定你的WHERE符合UNIQUE条件,要么你不知道,在这种情况下你应该花更多的时间来查看你的数据库并学习SQL。

但是......

 UPDATE jobs SET owner=me WHERE owner IS NULL ORDER BY job_submit_time LIMIT 1

非常实用!这使得一个接近无锁的作业队列,您可以从队列中获取作业,而无需等待,锁定或解决冲突。非常好。

 DELETE FROM cache ORDER BY last_update_time LIMIT N

缓存占用太多空间?清除N个最古老的行...

答案 1 :(得分:23)

好吧,如果你使用EXPLAIN,你会发现它会加速,因为一旦找到一个结果,它就会停止。

它也是一个故障保护 - 如果你知道你的更新插入应该只影响一行,通过指定它,你保证它不会出错并弄乱多行。

答案 2 :(得分:2)

我无法想象一个实例,其中一些加速查询并使其同时更安全的东西可称为过度杀伤。我将把我的投票放在良好实践专栏中。

答案 3 :(得分:1)

  

极少有用。要么你知道你的数据库足够确定> WHERE匹配UNIQUE条件,或者你没有,在这种情况下,你>应该花一点时间查看你的数据库并学习SQL

有些情况下限制1非常有用。例如,没有唯一键的表。如果我们有五个完全相同,那么限制一个将起作用。

答案 4 :(得分:0)

假设您正在编写忘记密码代码(在PHP中):

UPDATE
    `users`
SET
    `pass` = PASSWORD('{$new_salted_pass}')
WHERE
    `account_id` = '{$account_id}'
LIMIT 1

如果您的软件是软件即服务(SaaS),

多个组织使用您的软件,

account_id-organization_id字段在一起是唯一的ID,

account_id是在代码中自动生成的,如下所示:

JONES0001
JONES0002
JONES0003
...

软件工程师忘记将AND organization_id = '{$organization_id}'添加到查询的WHERE条件中,

在质量检查环境中测试“忘记密码”功能时,

代码通过质量检查,

然后将代码推送到生产环境,

然后 LIMIT 1可以限制两个组织的用户共享同一account_id时造成的损害。