【问题标题】:MYSQL select statement with non unique primary key具有非唯一主键的 MYSQL 选择语句
【发布时间】:2015-11-10 21:34:09
【问题描述】:

汽车

|Vin  |Make |Year|
|  1  |Honda|2009|
|  2  |Honda|2010|
|  3  |Honda|2009|
|  4  |Toyota|2009|

颜色

|Color|Make |Vin|
| Red |Honda|1|
|Blue |Toyota|4|
|Pink |Honda|2|

金融家

|Bank|Make |
| BOA |Honda|
| Cha |Toyota|
| PNC |Jeep|

一个查询

SELECT
car.Vin,
colors.Color,
financer.Bank
from Car 
JOIN Colors ON car.vin = colors.vin
           AND car.make = colors.make
JOIN financer ON car.make = financer.make
WHERE car.make = 'Honda'

尝试加入这些表,但获得的行数超出预期。我上面的financer 表没有唯一的列。

有没有一种方法可以通过组合 2 列来执行 ALTER TABLE 以使主键唯一?

【问题讨论】:

  • 主键在定义上必须是唯一的。你应该发布你得到的结果,以及你期望的结果。

标签: mysql key alter


【解决方案1】:

让我们从 RDBMS 细节退一步,考虑一下 financer 表没有唯一列意味着什么。这在您的应用程序世界中意味着什么?

  1. 这可能意味着特定的Make 有多个提供贷款的Bank,在这种情况下,该表中嵌入了某种选择或替代方案。

  2. 这可能意味着存在完全重复的行。

以下是这两种情况的示例。

|Bank |Make     |
| BOA |Honda    |
| TD  |Honda    |  1. more than one bank finances Honda
| Cha |Toyota   |
| PNC |Jeep     |
| PNC |Jeep     |  2. entirely duplicate row

此版本的financer 表生成此结果集 (http://sqlfiddle.com/#!9/27705/2/0)。正如您提到的那样,它有很多重复项

| Vin | Color | Bank |
|-----|-------|------|
|   1 |   Red |  BOA |
|   2 |  Pink |  BOA |
|   1 |   Red |   TD |
|   2 |  Pink |   TD |
|   4 |  Blue |  Cha |

您可以通过创建由两列组成的复合主键来防止完全重复的行。这在您的应用程序的世界中可能是有意义的。

如果你想要一个 1::1 的关系 Make::Bank,你可以在 Make 上放置一个主键。但我怀疑这不会正确地模拟您的应用程序的世界。 (http://sqlfiddle.com/#!9/27705/5/0)

也许你想要这个查询:

SELECT cars.Vin, cars.Make,
       GROUP_CONCAT(DISTINCT colors.Color) Colors,
       GROUP_CONCAT(DISTINCT financer.Bank) Banks
  from Cars 
  JOIN Colors ON cars.vin = colors.vin
             AND cars.make = colors.make
  JOIN financer ON cars.make = financer.make
 GROUP BY cars.Make, cars.vin

GROUP_CONCAT()GROUP BY 的这种组合为每辆车生成匹配颜色列表和匹配银行列表。

| Vin |   Make | Colors |  Banks |
|-----|--------|--------|--------|
|   1 |  Honda |    Red | TD,BOA |
|   2 |  Honda |   Pink | TD,BOA |
|   4 | Toyota |   Blue |    Cha |

如您所见,每辆本田汽车都有一个包含两个银行的列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-06
    • 2013-08-05
    • 2013-12-22
    • 2011-07-12
    相关资源
    最近更新 更多