我有一个表,其中需要一个由三个键组成的复合键: manufacturer, modelNumber
以及 parentModelNumber
每一行/条目都有一个 manufaturer
或者是 modelNumber
或者 parentModelNumber
. 复合键是否可以由一个主键和两个唯一键组成,以便允许其中一个唯一键具有空值?我在这件事上一直头痛不已,有人说“主键”是“唯一键”,但当“唯一键”允许为空值而“主键”不允许时,这又怎么可能呢?我很困惑。
如果我可以这样做一个复合键,威尔 INSERT ON DUPLICATE KEY UPDATE
当复合键由一个“主键”和两个“唯一键”组成,其中一个“唯一键”将具有空值时,对其求值?
我有人可以建议一个不同的方法,我愿意听。我只做了一个星期,我只知道我知道的不多。我也乐于阅读参考文章。谢谢您。
编辑_______________________________________________
@timbiegeleisen-假设我想为一个符合2001年福特f-150交流发电机条目,但交流发电机上没有型号。我会让制造商=福特,父型号=2001 f-150,型号=空。
现在假设我有一个由mechman制造的交流发电机,上面的型号是sk3345,但它不是为适合特定的车辆而制造的。我会让manufacturer=mechman,modelnumber=sk3345,parentmodelnumber=null。
我想把所有的交流发电机存储在一个表中,并要求每个条目有一个已知的制造商和一个已知的型号或一个已知的车辆,它适合。我想我可以用这个做两个表,但是我想知道是否所有的重复字段都是一个好主意。每行的其他字段是尺寸、材质类型和类似的详细信息。
2条答案
按热度按时间qij5mzcb1#
包含null的列不能是键或任何键的一部分。不幸的是,mysql有一种非标准语法,它对任何索引都使用word键,即使是可以为null和非唯一的索引。实键必须定义为NOTNULL并对其具有唯一性约束(唯一键或主键都可以执行此任务)。
在本例中,您似乎在一个表中建模三个不同的事物。我建议至少创建三个表:一个表用于带有零件号的零件;一张没有编号的零件表;一个表,将零件与它们适合的模型相关联。真正的问题是没有数字的零件应该用什么键。
9ceoxa922#
一个建议。
使用空字符串而不是null。这样可以避免
UNIQUE
钥匙。有
PRIMARY KEY(manufacturer, parentModelNumber, modelNumber)
也有INDEX(manufacturer, modelNumber)
使用应用程序代码处理任何唯一性约束。这包括不信任iodku(除非pk“正确”工作)。