【问题标题】:MySQL Database Unique Field (Not Table Unique)MySQL 数据库唯一字段(不是表唯一)
【发布时间】:2012-05-26 10:43:27
【问题描述】:

我建立了一个数据库,并为不同类型的项目提供了大约 8 个不同的表。我这样做是因为每个表都是一个类别,每个项目都有不同的字段,所以我无法将它们全部设为 1 个表。我遇到的问题是我需要 itemID 字段在所有表中都是唯一的。不仅仅是每张桌子都是独一无二的。

例如,如果管理员在 1 个表中添加项目,则该项目的 itemID 不能与不同表中的另一个项目重复,否则会给我带来问题。请帮我正确设置。我可以直接在数据库中执行此操作吗?或者我需要制作一个php脚本来检查项目编号是否已经存在?

我希望我解释得对。 :)

【问题讨论】:

  • 听起来你应该重新考虑整个结构,如果不晚的话。

标签: php mysql field unique


【解决方案1】:

创建一个表来保存全局唯一字段,这将是父表。

使所有其他全局唯一字段外键指向新表(字段),这些将是子表。

在插入时,请确保在插入子表之前始终将新值插入父表(否则会产生完整性违规)。

更新时请确保您始终只更新父表中的唯一字段,而不是子表中的唯一字段。

对子表中的外键添加进一步的唯一性约束,使它们不能指向相同的父表值。

【讨论】:

    【解决方案2】:

    您可以生成一个唯一 ID(如 GUID)并将其用作您的密钥(或作为备用唯一密钥)。或者有一个名为 say Entities 的表,其中有一个唯一的 id,然后向其中添加一个外键。 想法是,您插入实体,取回您的 id,然后使用它插入子表中。

    打赌你不会再犯这个错误了。 :(

    【讨论】:

      【解决方案3】:

      执行此操作的最简单方法是将每个 PK 转换为使用 GUIDJeff Atwood 有一篇很好的文章讨论了 ID 与 GUID 的相对优点。那里 甚至是 MySQL 中生成UUIDs 的函数。请注意,我从未使用过此功能,并且我知道它在复制时确实存在一些问题,尽管我相信这些问题已在最近的版本中得到修复。

      实现此目的的另一种方法是使用单独的表来控制实体本身并使用自动增量来保持 ID 的唯一性。然后,您的每个单独的表都将引用该表。就保持数据完整性的应用程序逻辑而言,这有点复杂,但这是可能的。

      或者,您可以根据第二个选项拥有主表和另一个包含键/值对的表,用于在不同类别之间变化的参数。如果额外参数都是主要实体信息的次要参数(不同类别之间没有变化),这可能是一个不错的选择。

      哪个选项最适合您实际上取决于您的数据模型的结构和语义以及您的用例(即您最常访问数据的方式)。

      有更多关于mapping this sort of inheritance structure to a relational database here 的信息。当然,如果你愿意在 MySQL 之外寻找,那么有各种 NoSQL 数据库更适合这种情况。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-04-21
        • 1970-01-01
        • 2017-01-08
        • 2010-10-05
        • 2021-11-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多