首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在外键约束中使用两列

问如何在外键约束中使用两列
EN

Stack Overflow用户
提问于 2015-04-25 06:21:17
回答 2查看 11.1K关注 0票数 2

我有两张桌子:

  1. Article
  2. Subscription

在Article表中,我有两个列组成主键:id,sl。在Subscription表中,我有一个外键'idsl`‘。

我使用这个约束:

代码语言:javascript
复制
constraint FK_idsl 
  foreign key (idsl) references CSS_SubscriptionGroup(id, sl)

但是,当我运行查询时,我会得到以下错误:

外键中的引用列数与引用列数不同,表X

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-25 07:00:31

在项目表中,我有两个字段是主键: id,sl。在订阅表中,我有一个外键'idsl`‘

这个设计失败了--很明显,Article(id, sl)中的复合主键在表Subscription中被损坏成一个单一的复合外键。这不是个好主意。

相反,您需要更改表Subscription的设计,以包括与Article表相同类型的id和sl的单独列,然后创建一个由两列组成的复合外键,以与主键相同的顺序引用Article,例如:

代码语言:javascript
复制
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.id或table.tableid的列应该是唯一的,并且是表的主键。但是,由于表Article需要在主键中增加一个列sl,这意味着id并不是唯一的。

票数 5
EN

Stack Overflow用户

发布于 2015-04-25 06:37:51

正确的关系语法:

代码语言:javascript
复制
CONSTRAINT FK_OtherTable_ParentTable
FOREIGN KEY(OrderId, CompanyId) REFERENCES dbo.ParentTable(OrderId, CompanyId)

你必须这样做:

代码语言:javascript
复制
constraint      FK_idsl     foreign key (id,sl)  references CSS_SubscriptionGroup(id,sl)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29861764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档