Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL两次引用同一个表_Mysql_Database_Foreign Keys_Primary Key - Fatal编程技术网

Mysql SQL两次引用同一个表

Mysql SQL两次引用同一个表,mysql,database,foreign-keys,primary-key,Mysql,Database,Foreign Keys,Primary Key,我一直在修补SQL,为一家企业开发一个数据库,我有一个表,它通过主键引用另一个表,但由于不同的原因这样做了两次。我可以这样做吗?更重要的是,我应该这样做吗 比如说,我们为其他公司修理汽车,我们有一个关于我们工作的每辆汽车的数据库。我们为一家名为Lots-o-Rental cars的公司和另一家名为Cool cars的公司修理汽车 现在,虽然酷车有自己的汽车可供选择,但他们也与Lots-o-Rental汽车公司达成了协议,可以借用他们的一些汽车。有些情况下,我们会对我们在一辆车上所做的工作收取Lo

我一直在修补SQL,为一家企业开发一个数据库,我有一个表,它通过主键引用另一个表,但由于不同的原因这样做了两次。我可以这样做吗?更重要的是,我应该这样做吗

比如说,我们为其他公司修理汽车,我们有一个关于我们工作的每辆汽车的数据库。我们为一家名为Lots-o-Rental cars的公司和另一家名为Cool cars的公司修理汽车

现在,虽然酷车有自己的汽车可供选择,但他们也与Lots-o-Rental汽车公司达成了协议,可以借用他们的一些汽车。有些情况下,我们会对我们在一辆车上所做的工作收取Lots-o-Rental汽车的费用,但其他情况下,我们会对在同一辆车上所做的工作收取酷车的费用

我当前的设置(此处简化)看起来有点像:

表格:公司

列:公司id(pk)、公司名称

1、停车场出租汽车

2、酷车

表格:分支机构(用于显示同一公司的多个营业地点)

列:分支机构id(pk)、公司id(fk)

1,1

2,1

3,2

表格:汽车

列:汽车识别码(pk)、汽车品牌、汽车型号、车主识别码(fk)、出租人识别码(fk)

“所有者id”和“承租人id”都是分支机构表中的分支机构id。 “on_hire”是一个值,用于确定汽车当前是否租给我们服务的另一家公司

1号,福特,野马,1号,是的,3号

2,大众,甲虫,1,不,无效

3,日产,脉冲星,2,否,无效

4,雪佛兰,卡马罗,3,不,空


使用此布局,我可以选择汽车品牌、汽车型号、车主id(显示为公司名称)吗?如果汽车被出租,还可以显示承租人id(显示为公司名称)?

在这种情况下,两次引用主键对我来说似乎很好。一种可能的替代方法是取消租用时的
,因为
hiree\u id==NULL
基本上意味着不租用时的
。您应该可以获得所需的信息。

在这个场景中两次引用主键对我来说似乎很好。一种可能的替代方法是取消租用时的
,因为
hiree\u id==NULL
基本上意味着不租用时的
。你应该可以得到你想要的信息。

是的,你可以这样做。在同一个表(
)中有两个不同的外键列(
)引用同一个表(
)是完全有效的

只要每个外键的“域”相同,就可以这样做。(域是该列的一组允许值。)您遇到麻烦的地方是您希望允许(例如)“酷车”成为“承租人”,但不允许它成为“车主”。然后,数据库强制执行这种约束是非常重要的。只要
公司
中的每一行都是“承揽人”和“所有人”的有效参考,就可以了


跟进

Q:我将使用什么SQL语句来显示汽车品牌、汽车型号、公司名称“Owned by”和公司名称“Hired by”

A:您的SELECT语句需要对
公司
表进行两次引用

由于查询中对
company
表的两个引用中的列的引用将是不明确的,因此我们必须限定列引用,并且对company表的至少一个引用将要求我们分配一个别名来消除引用的歧义。(这是一个示例,它演示了我们的模式,即始终为查询中的表引用分配别名,并限定所有列引用。)

跟进

我道歉。我完全错过了
分支
表。查询还需要引用该表

SELECT c.car_brand
     , c.car_model
     , o.company_name AS `Owned By`
     , h.company_name AS `Hired by` 
  FROM cars c
  LEFT
  JOIN branch bo
    ON c.owner_id = bo.branch_id
  LEFT
  JOIN company o
    ON bo.company_id = o.company_id 
  LEFT
  JOIN branch bh
    ON c.hiree_id = bh.branch_id
  LEFT
  JOIN company h 
    ON bh.company_id = h.company_id
 ORDER
    BY c.car_brand
     , c.car_model
     , o.company_name
     , h.company_name

是的,你能做到。在同一个表(
)中有两个不同的外键列(
)引用同一个表(
)是完全有效的

只要每个外键的“域”相同,就可以这样做。(域是该列的一组允许值。)您遇到麻烦的地方是您希望允许(例如)“酷车”成为“承租人”,但不允许它成为“车主”。然后,数据库强制执行这种约束是非常重要的。只要
公司
中的每一行都是“承揽人”和“所有人”的有效参考,就可以了


跟进

Q:我将使用什么SQL语句来显示汽车品牌、汽车型号、公司名称“Owned by”和公司名称“Hired by”

A:您的SELECT语句需要对
公司
表进行两次引用

由于查询中对
company
表的两个引用中的列的引用将是不明确的,因此我们必须限定列引用,并且对company表的至少一个引用将要求我们分配一个别名来消除引用的歧义。(这是一个示例,它演示了我们的模式,即始终为查询中的表引用分配别名,并限定所有列引用。)

跟进

我道歉。我完全错过了
分支
表。查询还需要引用该表

SELECT c.car_brand
     , c.car_model
     , o.company_name AS `Owned By`
     , h.company_name AS `Hired by` 
  FROM cars c
  LEFT
  JOIN branch bo
    ON c.owner_id = bo.branch_id
  LEFT
  JOIN company o
    ON bo.company_id = o.company_id 
  LEFT
  JOIN branch bh
    ON c.hiree_id = bh.branch_id
  LEFT
  JOIN company h 
    ON bh.company_id = h.company_id
 ORDER
    BY c.car_brand
     , c.car_model
     , o.company_name
     , h.company_name

谢谢你。把它打出来让我意识到“雇佣”专栏是多余的。谢谢你。典型的