MySQL 数据库唯一字段(不是表唯一字段)


MySQL Database Unique Field (Not Table Unique)

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

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

我希望我解释得对。 :)

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

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

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

更新

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

对子表中的外键添加另一个唯一约束,以便它们不能指向相同的父表值。

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

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

执行此操作的最简单方法是将每个 PK 转换为使用 GUID。杰夫·阿特伍德(Jeff Atwood)有一篇很好的文章,讨论了ID与GUID的相对优点。那里甚至是 MySQL 中生成 UUID 的函数。警告,我从未使用过此功能,我知道它在复制方面确实存在一些问题,尽管我相信这些问题已在最新版本中修复。

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

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

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

此处提供了有关将此类继承结构映射到关系数据库的详细信息。当然,如果你愿意在MySQL之外寻找,那么有各种NoSQL数据库可以更好地适应这种情况。