sql-server - 我可以使身份字段跨越SQL Server中的多个表吗?

标签 sql-server identity-column

我可以跨多个表使用“身份”(唯一,非重复)列吗?
例如,假设我有两个表:“书籍”和“作者”。

Authors
  AuthorID
  AuthorName
Books
  BookID
  BookTitle

BookID列和AuthorID列是标识列。
我希望身份部分跨越两列。
因此,如果有一个AuthorID值为123,则不能有一个BookID值为123。反之亦然。

我希望这是有道理的。

这可能吗?

谢谢。

我为什么要这样做?我正在编写一个APS.NET MVC应用程序。我正在创建评论部分。作者可以发表评论。书中可以有评论。我希望能够将实体ID(书籍ID或作者ID)传递给操作,并让该操作提取所有相应的注释。该 Action 将不在乎是书籍,作者还是其他。听起来合理吗?

最佳答案

简短的答案是:不,您不能这样做(至少在直到2008年的MS SQL Server中)。

您可以创建一个新表“CommentableEntity”,在其中插入您的标识列,然后在“作者和书籍”中定义外键以将其引用为父表,然后执行多种技巧之一以确保给定的ID值没有同时分配给这两个表...但这不是一个好主意,因为您构建的数据模型将暗示Authors和Books是相关的数据类型,而实际上不是。

您可以有一个单独的表“注释”,在其中具有“标识”列,然后在“作者”和“书”中都放置一个CommentId列。但是,这将使每本书和作者只能发表一个评论。

我,我可能会在Comments表中添加一列“CommentorType”,并在其中放置一个标记,以指示注释来源(作者为“A”,书籍为“B”)。在“CommentorId + CommentorType”上构建一个主键,它应该可以正常工作-随着系统的扩展,添加更多类型的评论者将变得微不足道。

关于sql-server - 我可以使身份字段跨越SQL Server中的多个表吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2428262/

相关文章:

linq-to-sql - Linq 到 Sql : Can I return the Identity_Scope after an insert?

asp.net - 在 Gridview 中显示同名的两列

sql-server - 连接到 sql server 时遇到问题 登录失败。 "The login is from an untrusted domain and cannot be used with Windows authentication"

MySQL:在与表 A 的联接结果中获取表 B 的行作为列。有比这更聪明/更好的方法吗?

sql - 如何在 SQL Server 中重置表的 IDENTITY 列?

Oracle Alter命令重命名现有列错误环

sql - 使用 T-SQL 窗口函数从 1 分钟数据检索 5 分钟平均值

SQL Server 打印没有空格的空行

c# - 如何将 asp.net web 应用程序连接到 kannel 短信网关?

c# - 在 SQL Server 中将标识列重置为零?