这是我的代码示例。我正在使用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表,它说: “Ms 1776,Level 16,State 0,Line 1 引用的表'AccaoFormacao'中没有主键或候选键与外键'fkAF_FDO'中的引用列列表匹配。“
我理解这条消息,但无法弄清楚如何修复它,因为我在约束pkAccaoFormacao中声明了主键,这对我来说毫无意义。
AccaoFormacao(codCr,ref)中的唯一约束有效,但与此同时它并不适合我在这里所做的事情。 AccaoFormacao是Curso的弱实体,因此我在AccaoFormacao中有一个复合主键。
EDIT1: 好吧,我想到了几个小时后我觉得很蠢。 我更改了约束fkAF_FDO外键(codCr,refAf)引用AF_FDO中的AccaoFormacao(codCr,ref)来约束fkAF_FDO外键(codCr,refAf)引用AccaoFormacao并且它起作用。它将获得AccaoFormacao的复合主键,其他方式也应该有效......
无论如何,谢谢你的帮助。
答案 0 :(得分:0)
AccaoFormacao没有PK,看看Ref和CodCr,FKS需要点PK。