没有主键的订单的MySQL项目?

没有主键的订单的MySQL项目?,mysql,sql,database,primary-key,Mysql,Sql,Database,Primary Key,我的数据库中有两个相互属于的表。 mp_订单和mp_订单项目 mp\U订单包含客户订单的主要信息,如地址、日期等。 (订单id、客户公司、客户名称、客户地址、订单日期等) mp\u order\u items具有已订购的产品/项目 (订单id、项目id、项目数量) 由于订单id和项目id可以重复(但不能组合),我无法将一列设置为主键。 我应该为单个条目实现另一列作为唯一标识符,还是有一个没有主键的表是有效的?因为,您的要求是,order\u id和item\u id不能在组合中重复,意思是:(o

我的数据库中有两个相互属于的表。 mp_订单和mp_订单项目

mp\U订单包含客户订单的主要信息,如地址、日期等。 (订单id、客户公司、客户名称、客户地址、订单日期等)

mp\u order\u items具有已订购的产品/项目 (订单id、项目id、项目数量)

由于订单id和项目id可以重复(但不能组合),我无法将一列设置为主键。
我应该为单个条目实现另一列作为唯一标识符,还是有一个没有主键的表是有效的?

因为,您的要求是,
order\u id
item\u id
不能在组合中重复,意思是:(ord\u 134,itm\u 123)不能重复本身,我相信您需要创建一个

主键(订单id、项目id)

基本上,订单Id和项目Id的组合将唯一标识表中的记录。 如果需要,在定义外键时有一个警告,您不能仅使用order_id链接表。您需要在外键关系中包含作为组合键一部分的所有列。

您有两个选项:

  • 上定义主键(订单id、项目id)
  • 定义合成主键,例如自动递增列
我喜欢第二种方法。它在未来更加灵活:

  • 也许一个订单可以包含相同的项目,但具有不同的定价或装运地址或装运时间
  • 这些行是用一个数字唯一定义的,这使得以后需要修改行时更容易找到它们
  • 这些行在另一个表中更容易被引用,例如,如果您有一个returns表,或者如果项目

当然,使用复合主键也很有效,也是实现逻辑的一种非常可行的方法。

将order\u id和item\u id都设置为主键,例如
主键(item\u id,order\u id)