外键的复合主键

时间:2013-07-02 04:59:53

标签: sql-server-2008-r2 foreign-keys composite-key

这是我的代码示例。我正在使用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的复合主键,其他方式也应该有效......

无论如何,谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

AccaoFormacao没有PK,看看Ref和CodCr,FKS需要点PK。