sql工作台中的复合主键与自动递增主键

Posted

技术标签:

【中文标题】sql工作台中的复合主键与自动递增主键【英文标题】:Composite primary keys vs auto increment primary key in sql workbench 【发布时间】:2021-07-04 03:32:24 【问题描述】:

我需要有迎宾经验的人的建议。

我的数据库中有一个关联实体,如下所示:

Table2-> CustomerID, ServiceID, DateSub

由于同一个客户(有 PK,例如 1111)可以多次但不能在同一日期要求相同的服务(有 PK,例如 3),因此表的复合 PK 2 不能只是 (CustomerID, ServiceID)。

现在我有两个选择:

1- "DateSub" 也是主键,所以表 2 的 PK 将是 (CustomerID, ServiceID, DateSub)

2- 为关联实体创建一个特定的 PK(例如,Table2ID,因此 CustomerID 和 Service ID 将为 FK)

您会采用这两种方法中的哪一种,为什么?谢谢

【问题讨论】:

第二个选项总是更好!。因为日期不应该是主键。大量客户在同一天提供相同的服务。因此,您需要为您的表指定一个特定的 PK,例如上面提到的第二个选项 Table2_id 或只是 Id 并选中自动增量 也许我会关注第一个 主键是唯一键,因此您的第二个选项将只允许每个客户 1 个,而不管服务如何......您是否预计每个客户每天只有一个服务请求。 我认为合成主键是最好的选择——如果需要的话。如果需要,(CustomerID, ServiceID, DateI) 表达式的唯一性可以通过额外的 UNIQUE 索引来控制(但我怀疑它是否有用)。 附言。如果您仍然使用复合 PK,那么请仔细考虑索引表达式中最有用的列顺序(它必须改进对该表的大部分查询)。不要忘记 PK 是聚集索引。 【参考方案1】:

首先您需要确定是否需要将CustomerIDServiceIDDateI 列的组合设为唯一?如果是这样,那么您应该选择第一个选项。

否则我会选择第二个选项。

如果 DateI 是日期数据类型,则使用第一个选项,您将无法为客户插入相同的服务两次。如果是日期时间,那么它是可行的。

如果您想在任何其他表中使用此主键(复合主键)作为外键,那么您也需要使用那里的所有三列。

【讨论】:

我现在添加一个澄清:同一个客户可以要求相同的服务,但在同一日期不能超过一次(服务持续一到三个月) 是否有可能将此主键用作任何其他表中的外键? 不,没有 那么我想进入第一点。如果这些列中的唯一性不是必需的,那么我会选择第二个选项。 您可以在下面的链接中阅读 Gordon Linoff 的答案。 ***.com/questions/50043071/….【参考方案2】:

我倾向于选择“自然”的 PK。您有 3 列,它们一起可以唯一地定义每一行。我会考虑使用它。

下一个问题是 3 列的放置顺序。这取决于常见的查询。请提供。

索引(包括 PK)仅在最左边使用。可能需要一些辅助键,以便有效地访问其他列。再次,让我们看看查询。

如果您有很多二级索引,可能最好有一个代理,AUTO_INCREMENT“id”作为 PK。再次,让我们看看查询。

如果您曾经使用过日期范围,那么可能最好将DateSub 放在任何索引的最后。 (有极少数例外。)

表格有多少行?

表格是ENGINE=InnoDB,对吗?

提醒:PRIMARY KEY 是唯一键,即INDEX

DateSub 的数据类型为 DATE,对吗?

【讨论】:

以上是关于sql工作台中的复合主键与自动递增主键的主要内容,如果未能解决你的问题,请参考以下文章

mysql的联合主键与复合主键区别

如何在 Room 持久库中使用复合主键时使主键自动递增?

复合主键?还是具有唯一复合索引的自动增量主键? [关闭]

MySQL 中的复合主键性能缺陷

初学者必备:MySQL的主键,外键与唯一约束设置(点赞!!!)

初学者必备:MySQL的主键,外键与唯一约束设置(点赞!!!)