2013-07-02 3 views
-1

이것은 내 코드의 샘플입니다. 나는 테이블 AF_FDO을 만들려고 할 때까지 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) 
) 

모든 것이 잘 간다 SQL Server를 사용하고, 그것은 말한다 : "메시지 1776, 수준 16, 상태 0, 줄 1 더 기본 또는 후보 없습니다 외래 키 'fkAF_FDO'의 참조 열 목록과 일치하는 참조 된 테이블 'AccaoFormacao'의 키. "

메시지를 이해할 수 있지만 pkAccaoFormacao 제약 조건에서 기본 키를 선언하고있어 문제를 해결하는 방법을 알 수 없습니다.

AccaoFormacao (codCr, ref)의 고유 제한 조건이 작동하지만 동시에 여기에서 내가하는 일에 "적합하지"않습니다. AccaoFormacao는 Curso의 약한 개체이므로 AccaoFormacao에 복합 기본 키가 있습니다.

EDIT1 : 시간이 지나면 알아 냈습니다. 나는 어리 석다. 제약 조건 fkAF_FDO 외래 키 (codCr, refAf)가 AF_FDO에서 AccaoFormacao (codCr, ref)를 참조하여 제약 fkAF_FDO 외래 키 (codCr, refAf)가 AccaoFormacao를 참조하고 작동합니다. AccaoFormacao의 복합 기본 키를 가져야합니다. 다른 방법으로도 작동해야합니다 ...

어쨌든 도움을 주셔서 감사합니다.

+0

숫자 (9,0) 기본 키? 그건 좋은 선택이 아닌 것 같습니다 .... –

+0

그건 내 문제의 원인으로 보이지 않습니다. 숫자를 사용하는 이유는 해당 키의 숫자 (예 : 신용 카드 번호)를 제한하기 때문입니다. – user8022070

+0

그런 말은하지 않았습니다. 나는 그것이 좋은 디자인이 아니라고 지적했다. 가져 가든지 남겨 두든지. –

답변

0

AccaoFormacao에는 PK가없고 Ref와 CodCr을 살펴보고 FKS는 PK를 가리켜 야합니다.

+0

"제약 조건 pkAccaoFormacao 기본 키 (ref, codCr)"는 ref 및 codCr 열에 영향을 미치지 않고 복합 기본 키가됩니까? – user8022070