2012-04-21 65 views
1

我一直在這裏搔着我幾個小時。從位於不同表格中的實體創建外鍵

我有四個表BookAuthorAllocationWorkSession

我需要做的是,bidauthID的組合從WorkSessionAllocation表中存在約束。

我試圖創建一個外鍵約束就像你通常會做,但它不會工作,因爲引用的ID是外國鍵已經和我不能創建一個新的密鑰,作爲分配表的標識符

CREATE TABLE Book(
bid NUMBER(4), 
title VARCHAR2(30) NOT NULL, 
SellingPrice NUMBER(6,2), 
PRIMARY KEY (bid), 
CONSTRAINT EM_SellingPrice CHECK(SellingPrice >= 0) 
); 

CREATE TABLE Author(
authID NUMBER(4), 
fName VARCHAR2(30), 
sName VARCHAR2(30), 
PRIMARY KEY(authID), 
CONSTRAINT EM_Name UNIQUE (fName,SName) 
); 

CREATE TABLE Allocation(
bid NUMBER(4), 
authID NUMBER(4), 
payRate NUMBER(6,2), 
CONSTRAINT AL_PayRate CHECK(payRate >= 1 AND payRate < 80), 
FOREIGN KEY(bid) REFERENCES Book(bid), 
FOREIGN KEY(authID) REFERENCES Author(authID) 
); 

CREATE TABLE WorkSession(
bid NUMBER(4), 
authID NUMBER(4), 
WorkYear NUMBER(4), 
WorkWeek NUMBER(2), 
WorkHours NUMBER(4,2), 
CONSTRAINT WY_Range CHECK(WorkYear > 2010 AND WorkYear < 2014), 
CONSTRAINT WW_Range CHECK(WorkWeek >= 1 AND WorkWeek <= 52), 
CONSTRAINT WH_Range CHECK(WorkHours >= 0.5 AND WorkHours <100), 
CONSTRAINT FK_Check FOREIGN KEY(bid, AuthID) REFERENCES Allocation(bid, AuthID), 
PRIMARY KEY(workYear, WorkWeek) 
); 
+0

嗨亞歷克斯,你到底在找什麼?只有外鍵是你關心的問題,或者你想將分配表與WorkSession綁定一件事你不能創建一個從外鍵到外鍵的關係 – 2012-04-21 09:29:33

+0

所以我終於弄明白了,並認爲這可能有助於任何人問題,最後,我將分配的外鍵分配爲該表的主鍵,這個鍵的錯誤是無法找到該表的主鍵。希望這有助於 – Ardenexal 2012-04-21 10:26:53

+0

「分配」的主鍵是什麼? – 2012-04-21 13:30:21

回答

3
CREATE TABLE Allocation(
bid NUMBER(4), 
authID NUMBER(4), 
payRate NUMBER(6,2), 
CONSTRAINT AL_PayRate CHECK(payRate >= 1 AND payRate < 80), 
FOREIGN KEY(bid) REFERENCES Book(bid), 
FOREIGN KEY(authID) REFERENCES Author(authID) 
); 

外鍵約束必須針對唯一的東西。您可以在一列或多列上使用PRIMARY KEY約束或UNIQUE約束來完成此操作。上面的表格「分配」沒有任何這些約束。

如果 {bid,authid}在表「allocation」中是唯一的,那麼您可以在該表中聲明PRIMARY KEY (bid, authid)。然後REFERENCES allocation (bid, authid)應該工作的外鍵。