这是我的代码示例。我正在使用 sql server 2008 R2
create table Entidade(
NIF numeric(9,0) primary key,
nome varchar(250) not null,
tipoEnt varchar(4) check (tipoEnt in ('CE','EC','CEEC',null))
)
create table Curso(
cod int primary key identity(1,1),
descricao text,
nHoras decimal(5,2),
NIFEnt numeric(9,0) references Entidade(NIF),
)
create table AccaoFormacao(
ref int identity(1,1) not null,
codCr int references Curso(cod) not null,
dtInicio date,
dtFim date,
BIFDR numeric(8,0) references Formador(BI),
constraint pkAccaoFormacao primary key(ref, codCr),
)
create table AF_FDO(
codCr int,
refAf int,
BI numeric(8,0) foreign key references Formando(BI),
constraint fkAF_FDO foreign key(codCr, refAf) references AccaoFormacao(codCr, ref),
constraint pkAF_FDO primary key(codCr, refAf, BI)
)
一切正常,直到我尝试创建表 AF_FDO,它说:“消息 1776,级别 16,状态 0,第 1 行引用表 'AccaoFormacao' 中没有与引用列列表匹配的主键或候选键在外键'fkAF_FDO'。”
我了解该消息,但不知道如何修复它,因为我在约束 pkAccaoFormacao 中声明了主键,这对我来说毫无意义。
AccaoFormacao(codCr, ref) 中的独特约束有效,但同时它不“适合”我在这里所做的事情。AccaoFormacao 是 Curso 的一个弱实体,因此我在 AccaoFormacao 中有一个复合主键。
EDIT1:好的,我在几个小时后才发现我觉得很愚蠢。我将 AF_FDO 中的约束 fkAF_FDO 外键(codCr, refAf) 引用 AccaoFormacao(codCr, ref) 更改为约束 fkAF_FDO 外键(codCr, refAf) 引用 AccaoFormacao 并且它起作用了。它将获得AccaoFormacao的复合主键,其他方式也应该工作......
无论如何感谢您的帮助。