你如何避免列名冲突?

时间:2011-02-23 11:53:00

标签: mysql sql conflict

我最近被分配了创建拍卖系统的任务。在我的工作中,我遇到了很多场合,由于列名不明确,我的包含连接的SQL查询无法执行。考虑拍卖的这个(简化的)表格结构:

auction

  • id
  • name
  • uid(创建竞价的用户的ID)

item

  • id
  • name
  • uid(添加项目的用户的ID)
  • aid(项目可用的拍卖ID)
  • price(初始价格)

user

  • id
  • name

bid

  • id
  • uid(出价用户的ID)
  • iid(价格已提高的项目)
  • price(报价)

正如您所看到的,有许多列具有冲突的名称。加入这些表需要使用一些可以消除歧义的措施。

我可以想到两种方法来做到这一点。首先是重命名列,为所有列添加缩写表名称,以便拍卖ID变为a_id,项目ID将变为i_id,并且bid表中的项目ID将成为b_i_id。这非常可靠,但会降低列名的可读性。

我能想到的另一种方法是编写显式查询:

SELECT `bid`.`id`, `user`.`name`, `bid`.`price`
FROM `bid`
JOIN `item` ON `item`.`id` = `bid`.`iid`
JOIN `user` ON `user`.`id` = `bid`.`uid`
JOIN `auction` ON `auction`.`id` = `item`.`aid`
WHERE `bid`.`price` > `item`.`price`
AND `auction`.`id` = 1
GROUP BY `user`.`id`
ORDER BY `bid`.`price` DESC;

这是可读且明确的,但需要大量额外的击键。

我使用的是第二种方法,但也许还有其他方法在类似情况下成功使用过?如何避免SQL查询中的列名冲突?

8 个答案:

答案 0 :(得分:12)

您可以尝试在表名上使用aliases吗?

select * from table1 as T1
join table2 as t2 on (t1.key=t2.foreignkey)

答案 1 :(得分:5)

You need to use AS alias.

您可以使用别名为表或列指定其他名称。如果您有非常长或复杂的表名或列名,这可能是一件好事。

别名可以是任何名称,但通常很短。

答案 2 :(得分:4)

您的方法是正确的,但您也可以为您的表格提供别名:

SELECT a.* FROM TableA A

在这里你可以简单地将TableA称为A.

答案 3 :(得分:3)

我的经验是,额外击键的好处超过了从远处开始到目前为止所需的短时间,最迟需要时看一下你一年前写的一个查询。

答案 4 :(得分:2)

经验法则是,如果您使用多个表,请对表进行别名,并明确地为所有列设置别名。

这种一致性将让你深入到力量,年轻的padawan。

答案 5 :(得分:2)

更改您的命名约定,以便每个数据元素在架构中具有唯一的名称,例如auction_idbid_iduser_id等。理想情况下,数据元素的名称在表格之间不会更改,但有时您需要添加限定符来创建同义词,例如adding_user_idbidding_user_id如果user_id在同一张表中出现两次。您应该在数据字典中记录数据元素名称及其同义词。

答案 6 :(得分:0)

您还可以在表名旁边定义表格列:

SELECT P.*,T.name AS type FROM <TABLE-A> AS P LEFT JOIN <TABLE-B> AS T ON P.id=T.id

答案 7 :(得分:0)

我遇到了MySQLSyntaxErrorException

您的SQL语法有误;检查手册 对应于您使用正确语法的MySQL服务器版本 在'rank

附近

执行以下查询后:

插入my_table(排名)值(1);

因为rank列名与sql关键字rank冲突。

解决方案:

我已经在rank列名称中添加了 反引号 ,问题已解决:

插入my_table(`rank`)值(1);

解决问题的另一种方法是使用 表名 代替 反引号

插入my_table(my_table.rank)值(1);