复合键由mysql中的主键和唯一键组成吗?

时间:2018-10-08 02:18:02

标签: mysql database-design composite-key unique-key

我有一个表,其中需要一个由三个键组成的复合键:manufacturer, modelNumberparentModelNumber每行/每个条目的值都为manufaturer,其中任一值都为modelNumberparentModelNumber。复合键是否可以由一个主键和两个唯一键组成,以便可以将其中一个唯一键设为空值?我一直在敲打墙,有人说“主键”是“唯一键”,但是当“唯一键”被允许为空值而“主键”是怎么回事呢?不?我很困惑。

假设我可以用这种方式制作一个复合键,当它由一个“主键”和两个“唯一键”组成,其中一个“唯一键”的值为空时,将INSERT ON DUPLICATE KEY UPDATE进行评估?

我可能会建议我接受一种不同的方法。我只做了大约一个星期,而我所知道的只是我并不了解。我也开放阅读文章的参考。谢谢。

EDITED _________________________________________________

@TimBiegeleisen-假设我要输入适合2001年福特f-150的交流发电机,但交流发电机上没有型号。我将拥有制造商=福特,parentModelNumber = 2001 F-150,modelNumber =空。

现在假设我有一个由Mechman生产的交流发电机,其型号为SK3345,但并非为适应特定车辆而生产。我需要制造商= Mechman,modelNumber = SK3345,parentModelNumber = null。

我想将所有交流发电机存储在一张桌子中,并要求每个条目都具有一个已知的制造商,以及一个合适的已知型号或已知车辆。我想我可以从中制作两个表,但是然后我想知道是否所有重复字段都是一个好主意。每行的其他字段是尺寸和材料类型以及类似的详细信息。

2 个答案:

答案 0 :(得分:2)

包含null的列不能是键或任何键的一部分。不幸的是,MySQL具有一种非标准的语法,该语法将单词KEY用作任何索引,甚至是可为空且非唯一的索引。实键必须定义为NOT NULL并具有唯一性约束(由UNIQUE或PRIMARY KEY来完成)。

在这种情况下,您似乎在一个表中建模三个不同的事物。我建议至少创建三个表:一个表带有零件编号的零件;一张桌子,上面没有数字;一张表格,将零件与其适合的模型相关联。真正的问题是,对于没有数字的零件要使用什么键。

答案 1 :(得分:0)

一个建议。

  • 使用空字符串而不是NULL。这样可以避免使用UNIQUE键的问题。
  • 拥有PRIMARY KEY(manufacturer, parentModelNumber, modelNumber)
  • 也有INDEX(manufacturer, modelNumber)
  • 使用应用程序代码来处理任何唯一性约束。这包括不信任IODKU(除非PK将“正确”运行)。