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

Psa*_*Tak 2 sql sql-server foreign-key-relationship

我有两张桌子:

  1. Article
  2. Subscription

Article表中,我有两列构成主键:id, sl。在Subscription表中我有一个外键“idsl”。

我使用这个约束:

constraint FK_idsl 
  foreign key (idsl) references CSS_SubscriptionGroup(id, sl)
Run Code Online (Sandbox Code Playgroud)

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

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

Stu*_*tLC 5

在文章表中,我有两个主键字段:id,sl。在订阅表中我有一个外键“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
);
Run Code Online (Sandbox Code Playgroud)

编辑

table.id这里需要考虑的一件事是,按照惯例,名为或 的列table.tableid应该是唯一的,并且是表的主键。但是,由于表需要主键中的Article附加列,因此这意味着它不是唯一的。slid