-1

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

无论如何感谢您的帮助。

4

1 回答 1

0

AccaoFormacao中没有PK,看一下Ref和CodCr,FKS需要点一个PK。

于 2013-07-02T05:13:42.127 回答