外键约束取决于类别

时间:2015-01-08 11:06:20

标签: sql-server constraints referential-integrity

我在表“Bill”和表“GeneralArticles”,“CalculatedArticles”和“AdditionalRecords”之间有一个m:n连接。

这些表格很简单。每个都有自己的ID(让我们称之为B_ID,其他的称为GA_ID,CA_ID和AR_ID)和一些其他字段。 问题是如何在Bill和这三个保证引用完整性的表之间建立一个m:n-connection-table?

我的第一个想法是简单地创建:

CREATE TABLE Bill_Articles(
[B_ID] [int] NOT NULL FOREIGN KEY REFERENCES Bill (B_ID) ,
[A_ID] [int] NOT NULL ,
Category [int] NOT NULL
CONSTRAINT [PK_Bill_Articles] PRIMARY KEY CLUSTERED 
            (
            [B_ID] ASC,
            [A_ID] ASC,
            [Category] ASC
            ))

我已经为类别设置了一个表格,所以理论上我可以使用1作为常规文章,依此类推,你就明白了。 问题是如何根据类别引用另一个表?

另一种解决方案是创建一个View,其中包含此Category-ID和Record的ID:

Create View Articles
AS
Select 1 Category,
        GA_ID A_ID FROM GeneralArticles
UNION 
SELECT 2 Category,
       CA_ID A_ID FROM CalculatedArticles
UNION 
SELECT 3 Category,
        AR_ID  A_ID  
        FROM AdditionalRecords

不幸的是,在设置Bill_Articles表时,我收到错误:

  

外键'FK__Bill_Ar_A_ID__7526B52E'引用对象'文章'   这不是用户表。

不知怎的,我无法使用这种视图来提供唯一的密钥。

有没有人知道这种问题的正确解决方案? 谢谢

1 个答案:

答案 0 :(得分:1)

由于这些原因,您通常不会创建一个包含列类别的表,因为您无法使用正确的外键。

你应该创建几个表。

一个用于链接Bills和GeneralArticles的表。第二个表链接Bills和CalculatedArticles。第三个表链接Bills和AdditionalRecords。

对于第一个链接,它可能看起来像这样(我没有检查语法):

CREATE TABLE BillsGeneralArticlesAssosiations(
[B_ID] [int] NOT NULL FOREIGN KEY REFERENCES Bill (B_ID) ,
[GA_ID] [int] NOT NULL FOREIGN KEY REFERENCES GeneralArticles (GA_ID)
CONSTRAINT [PK_BillsGeneralArticlesAssosiations] PRIMARY KEY CLUSTERED 
(
    [B_ID] ASC,
    [GA_ID] ASC
))

有时我会在此表中添加IDENTITYID作为主键。特别是如果此链接表中还有其他字段。