2015-04-25 87 views
0

我有两个表:如何使用两列外键约束

  1. Article
  2. Subscription

Article表我有两列组成的主键: idsl。在Subscription表中我有一个外键“idsl”。

我用这个约束:

constraint FK_idsl 
    foreign key (idsl) references CSS_SubscriptionGroup(id, sl) 

但是当我运行查询,我收到此错误:

Number of referencing columns in foreign key differs from number of referenced columns, table X

+2

您有一个* composite *主键,因此您需要* Subscription维护表中的两个离散*引用字段 –

+0

[外键引用SQL Server中的2列主键](http:// stackoverflow。 COM /问题/ 3178709 /外键引用-A-2列,主键,在-SQL服务器) – dyatchenko

回答

2

In Article Table I have two fields that are the primary key: id,sl. In the Subscription Table I have a foreign key 'idsl`

这种设计被破坏 - 显而易见的是,在Article(id, sl)复合主密钥已经错位到表Subscription单一化合物外键。这不是一个好主意。

相反,你将需要更改表Subscription的设计包括两个idsl单独列上相同类型Article表,然后创建一个复合外键由两列,在引用Article相同的顺序作为主键,例如:

CREATE TABLE Article 
(
    id INT NOT NULL, 
    sl VARCHAR(50) NOT NULL, 
    -- Other Columns 

    CONSTRAINT PK_Article PRIMARY KEY(id, sl) -- composite primary key 
); 

CREATE TABLE Subscription 
(
    -- Other columns 
    id INT NOT NULL, -- Same type as Article.id 
    sl VARCHAR(50) NOT NULL, -- Same type as Article.sl 

    CONSTRAINT FK_Subscription_Article FOREIGN KEY(id, sl) 
     REFERENCES Article(id, sl) -- Same order as Article PK 
); 

编辑

这里有一点要考虑的是,按照惯例,一列名为table.idtable.tableid应该是唯一的,并且是表格的主键。但是,由于表Article需要主键中的附加列sl,这意味着id不是唯一的。

2

的关系正确的语法:

CONSTRAINT FK_OtherTable_ParentTable 
FOREIGN KEY(OrderId, CompanyId) REFERENCES dbo.ParentTable(OrderId, CompanyId) 

你一定要试试像这样:

constraint  FK_idsl  foreign key (id,sl) references CSS_SubscriptionGroup(id,sl)