具有非唯一主键的MYSQL select语句

时间:2015-11-10 21:34:10

标签: mysql key alter

汽车

[[ $1 =~ ^.+\.[[:alnum:]]+$ ]]

颜色

|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' 表没有唯一的列。

有没有办法可以通过组合2列来使用ALTER TABLE来使主键唯一?

1 个答案:

答案 0 :(得分:0)

让我们从RDBMS详细信息中退一步,并考虑一下financer表没有唯一列意味着什么。在您的申请世界中,这意味着什么?

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

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

  3. 以下是两种情况的例子。

    |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 |
    

    如您所见,每辆本田汽车都有两个银行的清单。