2012-04-21 56 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)应该工作的外键。