教训与启示--编程规范:多表关联时一定要加上表名限定

select
type
from A
inner join B on A.id = B.id

来,看下这个sql是否有啥问题?在什么情况下会导致这条sql执行报错?

这个sql的问题在于:一旦A和B都有type这个字段,那么就会执行报错。如果由于表结构的改变导致A和B都有type字段,那么就会出现问题。

因此,多表关联一定要加上表名限定,否则就会有重名风险。改好后的例子如下,这样就可以很好应对表结构的变化:

select
B.type
from A
inner join B on A.id = B.id

这个编程规范是经过一次生产问题得出来的。每周线上都会有些表结构需要修改,好巧不巧这次表A新增的字段type在表B中也存在,同时表A和表B在同一条sql中join起来。由于此前type只在表B中出现,所以没有加上表名限定。一旦表A新增了type字段,这条sql的执行就报错了,因为有2个type,mysql不知道选择哪个,于是报错:com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'type' in field list is ambiguous

这种问题存在的本质是什么?是不确定性。程序的运行应该是确定的,不确定往往就意味着bug。这个案例中,对于type是属于A表还是B表是不确定的,正是这种不确定,导致了表结构变动时引发的bug。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值