连表查询时未指定表别名导致的查询错误

起因
在给数据库新增字段后,自己的的功能测试没问题,拍拍屁股走人了。然后就这么上了生产。
然后用户发现其他功能模块出问题,去看日志是sql报错:Column 'name' in field list is ambiguous。
。
奇怪:我的功能没问题,并且我都没改代码怎么其他地方会报这个错误呢?
分析
比如我加入的是 table1 表的 name 字段。
因为出问题的地方是别人代码中使用了连表操作而且并没有给字段别名,
然后用正好 select 用到了这个字段,且现在两个表都有这个字段 MySQL 不知道取哪个表的 name 于是导致报错。
- 问题sql:
1 | select name from table1,table2 where table1.id=table2.id; |
- 正例:
1 | select t1.name from table1 as t1 , table2 as t2 where t1.id=t2.id; |
总结
为了避免这种问题。
- 对于数据库中表记录的查询和变更,只要涉及多个表,都需要在列名前加表的别名(或 表名)进行限定。
- 对多表进行查询记录、更新记录、删除记录时,如果对操作列没有限定表的别名(或表名),并且操作列在多个表中存在时,就会抛异常。