2013-07-02 245 views
-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中有一個複合主鍵。

編輯1: 好吧我想了幾個小時後,我覺得很愚蠢。 我改變了約束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