从祖父表中有FK的子表引用父表?

时间:2014-02-13 16:08:39

标签: sql database oracle

所以我有一个像桌子叫人的话,然后我使用isA关系分支到教授和学生。当然,我有很多学生和教授参考人。现在我想创建另一个isA关系,它从Student,2个表格中分支,调用非GTA和GTA。然后我在这两个fk中引用人或学生?我的意思是我可以将FK引用到FK吗?

这是我的尝试

create table People
(name varchar(50),
ssn varchar(50) not null,
G# varchar(50),
primary key (ssn),
unique(name, ssn, G#))

create table Professor
(
name varchar(50),
ssn varchar(50) not null,
G# varchar(50),
teach_record varchar(50),
primary key (ssn),
unique (ssn, G#),
foreign key (name, ssn, G#) references People(name, ssn, G#) ON DELETE CASCADE
)

create table Student
(
name varchar(50),
ssn varchar(50) not null,
G# varchar(50),
primary key (ssn),
unique (ssn, G#),
foreign key (name, ssn, G#) references People(name, ssn, G#) ON DELETE CASCADE
)

这是非GTA

create table NonGTA
(
name varchar(50),
ssn varchar(50) not null,
G# varchar(50),
primary key (ssn),
unique (ssn, G#),
foreign key (name, ssn, G#) references Student(name, ssn, G#) ON DELETE CASCADE
)

1 个答案:

答案 0 :(得分:2)

如果我了解您,您的GTA和NonGTA表应该引用学生表。我知道GTA和NonGTA与学生有关,他们与教授或任何其他人无关。

但是外键必须引用一组声明为PRIMARY KEY或UNIQUE的列。您尝试在NonGTA中声明的外键无法引用{name,ssn,G#},因为对该列列没有合适的约束。改为引用{ssn}或{ssn,G#}。


其他可能的问题

如果G#应该是唯一的,那么People.G#应该被声明为UNIQUE。它也可能需要声明为NOT NULL。

在UNIQUE约束中考虑包含额外的,不必要的列。 可能没有理由在UNIQUE约束中包含“name”。 (特别是因为你不能轻易纠正拼写错误 - Oracle不支持ON UPDATE CASCADE。)

相关问题