【问题标题】:How to use two columns in a foreign key constraint如何在外键约束中使用两列
【发布时间】:2015-04-25 06:21:17
【问题描述】:

我有两张桌子:

  1. Article
  2. Subscription

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

我使用这个约束:

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

但是当我运行查询时,我得到了这个错误:

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

【问题讨论】:

标签: sql sql-server foreign-key-relationship


【解决方案1】:

在文章表中,我有两个作为主键的字段:id、sl。在订阅表中,我有一个外键 'idsl`

这种设计被破坏了——很明显Article(id, sl) 中的复合主键已被修改为表Subscription 中的单个复合外键。这不是一个好主意。

相反,您需要更改表 Subscription 的设计,以包含与 Article 表相同类型的 idsl 的单独列,然后创建一个复合外键,包括两列中,以与主键相同的顺序引用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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-30
      • 2011-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-03
      • 2014-08-11
      相关资源
      最近更新 更多