這是我的代碼示例。我使用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的組合主鍵,因爲它應該,另一種方式也應該工作...
感謝您的幫助無論如何。
數字(9,0)主鍵?這似乎不是一個好的選擇...... –
這似乎不是我的問題的原因。 我使用數字的原因是因爲我想限制該密鑰中的數字位數,例如,信用卡號碼。 – user8022070
沒有說出來。我指出這不是一個好設計。要麼接受,要麼離開它。 –