我几个小时都在摸不着头脑。
我有四张表Book
,Author
,Allocation
和WorkSession
我需要制定一个约束,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)
);
答案 0 :(得分: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)
应该工作的外键。