数据库开发中的常见陷阱与解决方案
在使用 SQL 查询时,尤其是在子查询或唯一性约束操作中,你可能会遇到类似
"more than one row with given identifier" 或
"Subquery returns more than one row" 的错误。
这通常意味着你的查询期望返回单一行(例如用于赋值、比较或作为标量子查询), 但实际上返回了多行数据,从而导致数据库引擎抛出异常。
SELECT name,
(SELECT email FROM users WHERE department = 'IT') AS it_email
FROM departments;
如果 users 表中有多个 IT 部门员工,上述子查询将失败。
= 比较符但右侧是多行结果SELECT * FROM orders WHERE customer_id = (SELECT id FROM customers WHERE city = 'Beijing');
若北京有多个客户,该语句会报错。
IN 替代 =:当预期多行时,改用 IN。LIMIT 1:如果你确定只需要一行(如最新记录),可加限制。DISTINCT、GROUP BY 或业务逻辑保证子查询唯一。MAX()、MIN() 获取单一值。
-- 正确方式 1:使用 IN
SELECT * FROM orders
WHERE customer_id IN (SELECT id FROM customers WHERE city = 'Beijing');
-- 正确方式 2:限制为一行
SELECT * FROM orders
WHERE customer_id = (
SELECT id FROM customers
WHERE city = 'Beijing'
ORDER BY created_at DESC
LIMIT 1
);