如何在数据库表的列中实现“主”Id 值

Posted

技术标签:

【中文标题】如何在数据库表的列中实现“主”Id 值【英文标题】:How to implement a "master" Id value in a column of a database table 【发布时间】:2013-02-15 13:25:33 【问题描述】:

假设我有 3 个如下表:

PersonId INT [PK,唯一集群 idx,身份是] PersonName VARCHAR(50) [非空] ContactId INT [唯一非clust idx,非空,FK到Contact表的ContactId列]

公司 CompanyId INT [PK,唯一集群 idx,身份是] 公司名称 VARCHAR(100) [非空] ContactId INT [唯一非clust idx,非空,FK到Contact表的ContactId列]

联系方式 ContactId INT [PK,唯一集群 idx,身份是] CreatedDate DATETIME [非空,默认值getdate()]

我将在以下 3 次插入操作(从所有空表开始)中显示所需的最终结果...

我在 Person 中插入一行,并希望得到:

人员表 - 个人编号 1 PersonName '第一人称' 联系人 ID 1

联系表 - 联系人 ID 1 CreatedDate getdate() 值

然后我在 Company 中插入一行,并希望得到:

公司表 - 公司编号 1 公司名称“第一家公司” 联系人 ID 2

联系表 - 联系人 ID 2 CreatedDate getdate() 值

我在 Person 中插入第二行,并希望得到:

人员表 - 个人编号 2 PersonName '第二个人' 联系人 ID 3

联系表 - 联系人 ID 3 CreatedDate getdate() 值

我希望以上说明我想要完成的工作,即我想使用 Contact 表作为一种“唯一值生成器”类型的机制,可以这么说,以便任何时候我插入一行个人或公司(或我想在其中放入类似 ContactId 列的任何其他表),任何/所有这些表中的每个 ContactId 值都是唯一的。

实现此目的最有效的方法是什么?是否可以使用 Person 和 Company 表上的触发器来执行此操作,以便我只能从我的应用程序代码中执行一个插入操作(如果可以,触发器代码会是什么样子)?或者我是否总是必须从我的应用程序代码中执行多个 I/O 操作,其中我首先在 Contact 表中插入一行,取回 scope_identity() 值,然后将该值用于插入到 Person 的 ContactId 值或公司?还是其他比其中任何一种更好的方法?

非常感谢任何见解!

【问题讨论】:

另外,我为我的帖子的格式道歉 - 我尝试使用回车,但他们似乎没有“接受”...... 嗯...一个小问题,究竟如何确保回车在一个人的帖子中“工作”?我搜索了常见问题解答并没有看到任何关于此的内容... 【参考方案1】:

您需要为您的contactId 提供sequence,并根据触发器从contactId 序列中插入值

【讨论】:

天哪!我做 SQL Server 已经 15 年了,我从来没有见过 CREATE SEQUENCE 的东西,所以谢谢你的提示(可能对其他一些事情有用)。但是,我不确定它对我的具体情况有帮助。如果我正确理解了 CREATE SEQUENCE(在查看了您的精彩链接之后)... ... 如果在我的场景中 Contact 表甚至不存在,而我需要做的就是在两个或多个表的特定列中拥有一组唯一的值,CREATE SEQUENCE会工作。但我确实需要让 Contact 表中的 ContactId 值成为“主”值,可以这么说(它实际上将被用作其他一些表中的 FK 目标)。因此,在这种情况下,CREATE SEQUENCE 似乎还不够(而且我仍然可能需要做一些类似于从我的应用程序代码插入两次的技术)。还是我错过了什么? 您需要确保在插入人员或公司表之前,触发器会在联系人表中插入序列的下一个值,然后将序列的当前值插入到实际表中 嗯...但是如果我使用插入前触发器,例如在 Person 表上,我不能只插入到 Contact 表(我定义 Contact 表的方式) ,从该插入中获取 scope_identity() 值,然后将该值用于 Person 的 ContactId 值,而不是使用 CREATE SEQUENCE 技术?或者这样做有什么问题吗? yep.since you are using sql server you can make your id in contact table as identity (这反过来意味着它将在内部作为一个序列实现)并使用scope_identity获取它的值。但是拥有单独序列的好处是您可以控制它

以上是关于如何在数据库表的列中实现“主”Id 值的主要内容,如果未能解决你的问题,请参考以下文章

使用 ASP.Net 在 SQL 中对表的列值求和时出现异常

如何在 Oracle Analytics Cloud 专业版中实现具有相同 id 的列中条目的字符串连接?

如何计算 ID 在不同表的列中出现的次数

如何在 postgresQL 查询中实现数学表达式?

如果同一表的另一列中存在值,如何找到对应的列值

如何在rails中实现复合主键