Siam博客

mysql JOIN 表前缀

2024-07-02

相关报错

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 部分,尽管一开始的字段并不会多个表重复,也要加上表前缀,这样子业务演变后 就不会造成破坏性变更,可以业务正常运行

本文链接:
版权声明: 本文由 Siam原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权

扫描二维码,分享此文章