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

我有两个表:

  1. 文章
  2. 订阅

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

最佳答案

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 不是唯一的。

https://stackoverflow.com/questions/29861764/

相关文章:

python - 类型错误 : key is not

ruby - 我在哪里可以看到我的浏览器发送的 http 请求

asp.net-mvc - 如何在 web.config 中设置密码和用户名

python - 列出目录中的所有文件 - 按大小过滤

PHP - 如何获取 n 深多维数组的所有数组值?

macos - 将 MAC 上远程桌面中的下移控制向下箭头发送到 Windows PC

bash - ANSI 转义在 `printf` 中不起作用

.net - Nuget - 无法解析以前可以解析的包

sql - 使用当前连接从 sql 存储过程调用 dll 函数

java - String.split() 如果在字符串的最后部分,则忽略定界符之间的空值