2013-02-15 56 views
1

说的一列实施“主” ID值,我有3个表如下所示:如何在数据库表


PERSONID INT [PK,独特的clust IDX,身份是]
PERSONNAME VARCHAR(50)[非空]
的ContactID INT [独特的非clust IDX,非空,FK到联系表的使用ContactID柱]

公司
CompanyId INT [PK,独特的clust IDX,身份是]
公司名称VARCHAR(100)非空]
的ContactID INT [独特的非clust IDX,非空,FK到联系表的使用ContactID列]

联系
的ContactID INT [PK,独特的clust IDX,身份是]
CreatedDate DATETIME [非空,默认值GETDATE()]

我将展示在以下3个插入操作所需的最终结果(首发与所有空的桌子)...

我插入一行到人,并希望结束:

Person表 -
PERSONID 1
PERSONNAME '第一人称'
的ContactID 1

联系表 -
ContactId 1
CreatedDate getdate()value

然后我插入一行到公司,并希望与落得:

公司表 - CompanyId 1
公司名称 '一公司'
的ContactID 2

联系表 - ContactId 2
CreatedDate getdate()值

我在Person中插入第二行,并将wan吨到结束:

Person表 - PERSONID 2
PERSONNAME '第二人'
的ContactID 3

联系表 - 的ContactID 3
CreatedDate GETDATE()值

我希望上面的说明清楚了我正在努力完成的事情,即,我想使用Contact表作为一种“唯一值生成器”类型的机制,这样我就可以在任何时候向Person或Company插入一行(或任何额外的表,我想将类似的ContactId列插入),任何/所有这些表中的每个ContactId值都将是唯一的。

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

任何见解都非常感谢!

+0

另外,我对我的帖子的格式道歉的ContactID序列 - 我试图用回车,但他们似乎并没有“拿”...... – user2075599 2013-02-15 13:26:22

+0

呃......一个小问题,如何确保回车在工作岗位上“工作”?我搜索了常见问题,并没有看到任何关于这个...... – user2075599 2013-02-15 14:04:51

回答

0

您需要为您的ContactID和插入值sequence基于触发器

+0

圣牛!我一直在做SQL Server 15年,我从来没有见过CREATE SEQUENCE的东西,所以谢谢你的提示(可能对其他一些事情有用)。但是,我不确定这对我的具体情况有帮助。如果我正确地理解了CREATE SEQUENCE(检查完你的优秀链接后)... – user2075599 2013-02-15 13:54:15

+0

...如果在我的场景中,Contact表甚至不存在,我需要做的就是在一个唯一的值集合中跨两个或更多表的特定列,CREATE SEQUENCE将起作用。但我确实需要让Contact表中的ContactId值为“主”值,可以这么说(实际上它将用作其他表中的FK目标)。所以在这种情况下,CREATE SEQUENCE看起来似乎不够用(而且我仍然可能需要做一些类似于我的应用程序代码的双插入技术)。或者我错过了什么? – user2075599 2013-02-15 13:54:37

+0

您需要确保在插入人员或公司表格之前触发器将序列的下一个值插入到联系人表格中,然后将序列的当前值插入实际表格中 – sasikt 2013-02-15 14:00:41