【问题标题】:Can I create a composite key with an extra character?我可以创建一个带有额外字符的复合键吗?
【发布时间】:2020-03-09 15:01:18
【问题描述】:

我正在使用 MySQL 构建一个新数据库来存储从各种项目中学到的经验教训。当我们在办公室谈论这个时,我们通过项目编号和课程编号来指代课程,即 PR12-81,其中 PR12 是指项目,81 是指该项目中的特定课程。我希望我的数据库中的主键也有一个连字符。

在 SQL 中定义复合键时,我可以让它引用项目和课程,但没有连字符,即 PR1281。我还考虑创建一个数据类型为 CHAR(1) 的单独列,在每一行中放置一个连字符,并声明 PK 由 3 列组成。

还有其他方法可以指定要以首选方式格式化的主键吗?

【问题讨论】:

  • 如果键是复合键,则在为 UI 层编写视图或查询时省略连字符并将其添加回来。它不需要存储。恕我直言。
  • 这是一个常见问题解答。在考虑发布之前,请阅读手册和谷歌任何错误消息或您的问题/问题/目标的许多清晰、简洁和精确的措辞,有和没有您的特定字符串/名称和站点:stackoverflow.com 和标签;阅读许多答案。如果您发布问题,请使用一个短语作为标题。请参阅How to Ask 和投票箭头鼠标悬停文本。

标签: mysql sql database composite-primary-key


【解决方案1】:

让你的表的主键是一个没有任何“意义”的无意义的自增数字。然后,在该表中,定义 两个 列:project_number 和 lesson_number。如果两者需要唯一,请定义一个包含这两个字段的UNIQUE 索引。

不要(!)创建将信息嵌入其中的数据库键,即使企业这样做。如果业务需要引用PR12 之类的字符串,那就这样吧……创建一个列来存储适当的值,或者使用一对多表。根据需要使用索引来强制唯一性。

注意(!)我现在描述了 四个 列:

  1. 基于自动增量的“实际”主键,不包含任何信息。
  2. project_number 列,可能是projects 表的外键。
  3. 同上lesson_number。 (如果需要,使用UNIQUE 复合索引。)
  4. 包含“企业使用的字符串”的列(或表)。

随着时间的推移,商业惯例确实会发生变化。有朝一日,您可能会……不,您会…………遇到一个“业务使用的字符串”,该字符串是错误由执行此操作的人分配的这样的事情!您的数据库设计需要优雅地处理这个问题。我所描述的架构是所谓的第三范式。如果您还没有在“范式”上进行 Google 搜索。

【讨论】:

    猜你喜欢
    • 2010-11-09
    • 2016-05-12
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    • 2020-07-07
    • 2022-11-30
    • 1970-01-01
    相关资源
    最近更新 更多