什么时候在MySQL中查询结尾处添加LIMIT 1是合适的。我通常在DELETE中添加它,但我已经看到它与INSERT a甚至UPDATE一起使用。这是一种矫枉过正还是一种好习惯?
答案 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时造成的损害。