SQL Server 是否有一种模式,其中 PK 在所有表中都是唯一的?

Dav*_*len 0 sql-server entity-framework-core

SQL Server 是否有一种模式,可以从单个计数器中提取创建时的所有 PK 值,以便所有表中没有两条记录具有相同的 PK?

我要求进行测试。我遇到了一个错误,我在记录中引用了错误的 FK 属性。单元测试通过了,因为对于单元测试中的记录,该记录中的两个 FK 正确地具有相同的值。

如果有一种模式不允许所有表中出现任何重复的 PK 值,则该单元测试就会发现错误。

小智 6

简而言之,没有切换到翻转或“模式”来执行此操作。

SQL Server 有一些内置工具可以帮助解决此问题,但许多类似的解决方案实际上是在应用程序端实现的。话虽这么说,可能有几种方法可以完成可能有效的事情。

顺序

假设您对这些键使用某种数字类型,SQL Server 会提供一个SEQUENCE对象 ( CREATE SEQUENCE ),该对象可以帮助向多个其他进程(或对象)提供始终递增的值。将其视为一个IDENTITY不特定于表的对象。根据微软的说法,

序列是用户定义的架构绑定对象,它根据创建序列所用的规范生成数值序列。

您可以DEFAULT向列添加约束并从序列分配(例如:SO:序列作为列的默认值)。因此,如果您的测试可以接受,您可以向所有键列添加默认约束,并分配同一序列中的所有键值。就我个人而言,我不建议将其作为生产就绪的解决方案(我实际上从未在生产中见过这种设置),但它听起来确实像您正在寻找的那样。

唯一标识符

或者,如果您使用某种字符串类型作为键,我已经看到许多使用 uniqueidentifier 的数据库实现它基本上只是一个 GUID 值,为数据库中的每个键值键入。当然,它们与uniquenessMicrosoft 领域中的其他 GUID 类型相同,您可以在很多地方阅读到这些内容,但很可能会解决您面临的唯一性问题。

您可以从NEWID等内置函数获取新的 GUID 值,也可以为此设置列默认值。

这更像是一种生产就绪的方法,我已经在许多数据库中看到了它的实现。我不喜欢这个选项,因为需要额外的存储空间(与基本 int 类型相比),并且日常使用 GUID 值有点困难。但微软几乎专门为此目的提供了这种类型,并且在跨表使用值方面有一些不错的功能。