1

几个小时以来,我一直在为此挠头。

我有四张桌子BookAuthorAllocationWorkSession

我需要做出一个约束,即bid和的组合authID存在于Allocation表中的WorkSession表中。

我尝试像通常那样创建外键约束,但它不起作用,因为引用的 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)
);
4

1 回答 1

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} 在“分配”表中是唯一的,那么您可以PRIMARY KEY (bid, authid)在该表中声明。一个REFERENCES allocation (bid, authid)应该可以工作的外键。

于 2012-04-21T12:26:36.317 回答