SQLite如何仅删除fosters_user表中user_id为admin的第一条匹配记录
错误原因分析
- 第一段SQL错误:子查询
SELECT "admin" FROM fosters_user返回的是固定字符串admin,等同于直接写WHERE user_id = 'admin',会匹配表中所有user_id为admin的记录,因此两条记录全部被删除。 - 第二段SQL错误:子查询
SELECT user_id FROM fosters_user WHERE user_id = "admin" LIMIT 1仅限制了子查询返回1行值为admin的结果,外层WHERE user_id IN (...)依然会匹配所有user_id为admin的记录,LIMIT不会作用到外层的删除逻辑,所以还是会删除全部admin记录。
正确实现方案
SQLite原生支持在DELETE语句中使用LIMIT子句,两种常用实现方式如下:
方案1:DELETE直接加LIMIT
最简单的写法,直接限制删除的匹配行数为1即可:
DELETE FROM fosters_user WHERE user_id = 'admin' LIMIT 1;
如果需要指定删除的目标行(比如按主键顺序删最早/最晚插入的记录),可以补充ORDER BY子句,示例(假设表存在自增主键id,删除最早插入的admin记录):
DELETE FROM fosters_user WHERE user_id = 'admin' ORDER BY id ASC LIMIT 1;
方案2:通过唯一rowid匹配删除
如果需要严格保证仅删除单条,可以利用SQLite表默认自带的唯一隐藏字段rowid做匹配:
DELETE FROM fosters_user WHERE rowid = ( SELECT rowid FROM fosters_user WHERE user_id = 'admin' LIMIT 1 );
子查询中也可以加ORDER BY子句指定要删除的目标行。
内容的提问来源于stack exchange,提问作者Itzik
相关产品推荐
相关产品推荐

