1

私はこれに何時間も頭を悩ませてきました。

BookAuthorAllocationおよびの 4 つのテーブルがあります。WorkSession

と の組み合わせがテーブルからテーブルbidauthID存在するという制約を作成する必要があります。AllocationWorkSession

通常のように外部キー制約を作成しようとしましたが、参照されている 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)
);

外部キー制約は、一意のものをターゲットにする必要があります。これは、1 つ以上の列に対して PRIMARY KEY 制約または UNIQUE 制約を使用して行うことができます。上記のテーブルの「割り当て」には、これらの制約のいずれもありません。

{bid, authid} がテーブル「割り当て」で一意である場合、そのテーブルで宣言できますPRIMARY KEY (bid, authid)REFERENCES allocation (bid, authid)そのときに機能するはずの外部キー。

于 2012-04-21T12:26:36.317 に答える