【问题标题】:Foreign key in composite primary key复合主键中的外键
【发布时间】:2012-01-04 20:28:12
【问题描述】:

我有以下 3 个表:

tblA

ID - PK
name

tblB

ID - PK
tblAID - FK references tblA.ID
pkID2

tblC

ID - PK
tblAID *
fkID2 *
...

我想让这个元组成为 (tblB.tblAID, tblB.pkID2) 的 FK

如果我这样做:

alter table tblC with check 
add constraint FK_tblC_tblB 
foreign key (tblAID, fkID2) 
references tblB (tblAID, pkID2)

我收到一条错误消息:

引用的表“tblB”中没有主键或候选键 与外键中的引用列列表匹配 'FK_tblC_tblB'

即:我想确保插入tblC 的元组对存在于tblB 中。但我不能这样做,因为pkID2 不是关键。真的 tblB 可以将 tblAID, pkID2 作为复合主键。但是 tblAID 仍然必须是 tblA.ID 的 FK。

【问题讨论】:

  • 这是半说辞,但为什么你放入 tblC 的列不能直接进入 tblB?
  • 我不清楚你想要完成什么。此约束的目的是防止向 tblC 添加行,除非 tblB 包含类似 tblAID 和 pkID2 值,并防止在 tblC 包含类似 tblAID 和 pkID2 值时从 tblB 中删除?

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


【解决方案1】:

实际上 tblB 可以将 tblAID、pkID2 作为复合主键。

或者从这两个字段创建一个新的唯一键。外键不需要引用主键。

但是 tblAID 仍然必须是 tblA.ID 的 FK。

这仍然有效。主键或唯一键中的列也可以参与其他约束,包括外键约束。

【讨论】:

猜你喜欢
  • 2018-04-07
  • 1970-01-01
  • 2013-06-29
  • 1970-01-01
  • 2017-08-06
  • 2022-11-21
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
相关资源
最近更新 更多