相关报错
SQL 错误 [1052] [23000]: Column 'xxx' in where clause is ambiguous
问题举例
假设有以下两个表
CREATE TABLE users (
user_id INT PRIMARY KEY,
name VARCHAR(50),
email VARCHAR(50),
is_vip VARCHAT(1)
);
CREATE TABLE orders (
id INT PRIMARY KEY,
user_id INT,
amount DECIMAL(10, 2),
order_date DATE
);
查询订单 关联出用户: 重复查出 user_id 会报错,需要用AS 别名
,或者表前缀.user_id
SELECT id, user_id, name, email, amount, order_date
FROM users
JOIN orders ON users.user_id = orders.user_id
WHERE id = 1;
where条件 筛选记录123用户(并且是会员)的订单记录:会报错 没有指定表前缀.user_id
SELECT * FROM orders JOIN orders ON users.user_id = orders.user_id
WHERE user_id = 1223 AND is_vip = 1
————————————
以上举例 是我们先创好表,再写sql,问题很容易看出来 也很容易解决。那我们现在反过来,假设orders表一开始的结构你写好了N多的代码去查出is_vip
用户的所有订单
SELECT * FROM orders JOIN orders ON users.user_id = orders.user_id
WHERE is_vip = 1
此时该sql可以正常运行,可是业务演变之后,可能有一个同事直接在orders表也加了一个is_vip
字段(出于各种优化或者数据所需的场景)此时这个语句就会报错in where clause is ambiguous
- 一开始是不重复的字段名,现在变成多个表重复的了,就需要指定
表前缀.字段名
上线之后,才发现 好多地方都开始报错了,因为以前没有指定表前缀,只能一个一个修
记录这篇文章 就是因为在业务中 历史遗留代码就是这样子写的,在 join 表的时候没有每个字段都去加表前缀,仅仅是加了当时重复的字段名的表前缀
解决方案
在join表,select/where 部分,尽管一开始的字段并不会多个表重复,也要加上表前缀,这样子业务演变后 就不会造成破坏性变更,可以业务正常运行
扫描二维码,分享此文章