【问题标题】:Foreign_Key reference to part of Composite Primary_KeyForeign_Key 对 Composite Primary_Key 部分的引用
【发布时间】:2017-12-22 18:51:08
【问题描述】:

我有如下三张表:

Country
{ 
    CountryCode Char(3) NOT NULL PRIMARY KEY,
    CountryName VARCHAR(50)
}

PostalCode
{ 
    PostalCode VARCHAR(10),
    CountryCode Char(3),

    CONSTRAINT PK_PostalCode 
        PRIMARY KEY (PostalCode,CountryCode)
}

Ticket
{ 
    TicketID INT NOT NULL PRIMARY KEY,
    PostalCode VARCHAR(10),
    CountryCode Char(3)   
}

我可以轻松地将Ticket 表中的CountryCode 设为Country 表的外键引用:

ALTER TABLE Ticket 
ADD CONSTRAINT FK_CountryCode
    FOREIGN KEY (CountryCode) REFERENCES Country(CountryCode);

但是当我尝试在Ticket 表中设置PostalCode 作为对PostalCode 表的外键引用时:

ALTER TABLE Ticket 
ADD CONSTRAINT FK_PostalCode
    FOREIGN KEY (PostalCode) REFERENCES PostalCode(PostalCode);

我收到一条错误消息:

引用表“PostalCodes”中没有与外键“FK_PostalCode”中的引用列列表匹配的主键或候选键

我知道这是因为 PostalCodePostalCode 表中复合 PK 的一部分 - 我该如何解决这个问题?

【问题讨论】:

  • 对不起,我忘了放在这里,我会相应地编辑帖子
  • 如果您可以在 PostalCode 中添加 'Unique' 和 'Not Null' 约束,那么它可以用作候选键,否则您不能在该列上有 FK。
  • 你需要做FOREIGN KEY (PostalCode,CountryCode) REFERENCES PostalCode(PostalCode,CountryCode);

标签: sql sql-server foreign-keys composite-primary-key


【解决方案1】:

不能仅引用主键的一部分 - 这是一个全有或全无选择,没有中间立场:要么您引用 WHOLE 主键(在外键中同时使用 PostalCode CountryCode),如下所示:

ALTER TABLE Ticket 
ADD CONSTRAINT FK_PostalCode
    FOREIGN KEY (PostalCode, CountryCode) REFERENCES PostalCode(PostalCode, CountryCode);

或者你不要引用PostalCode表。

【讨论】:

  • 是的,但是在这种情况下(如果我引用整个)我将无法将 CountryCode 本身作为外键吗?
  • @AhmedAli:你当然可以——你为什么不能这样做? CountryCode 列可以是多个 FK 约束的一部分,如果您愿意的话....
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-06
  • 1970-01-01
  • 1970-01-01
  • 2019-06-03
  • 1970-01-01
  • 1970-01-01
  • 2011-12-12
相关资源
最近更新 更多