【发布时间】:2020-06-20 03:09:36
【问题描述】:
我必须构建和填充超类型-子类型关系,但我无法让它按应有的方式工作。基本上 PERSON 表是表 STUDENT 和 TEACHER(子类型)的超类型。但是一个人可以是学生也可以是老师。
属性:
PERSON(p_id, name, dob)
学生(s_id、p_id、年级)
教师(t_id,p_id,电话)
学生和老师都应该有姓名和出生日期以及作为外键的 p_id,但如果它存在于一个表上,则不应在另一个表上
CREATE TABLE PERSON ( -- SUPERTYPE
p_id NUMBER(2) CONSTRAINT c1 PRIMARY KEY,
name CHAR(15),
dob DATE
);
CREATE TABLE STUDENT ( -- SUBTYPE
s_id NUMBER(2) CONSTRAINT c2 PRIMARY KEY,
p_id_fk,
grade CHAR(1),
FOREIGN KEY (p_id_fk) REFERENCING PERSON (p_id)
);
CREATE TABLE TEACHER( -- SUBTYPE
t_id NUMBER(4) CONSTRAINT c3 PRIMARY KEY,
p_id_fk,
tel CHAR(8),
FOREIGN KEY (p_id_fk) REFERENCING PERSON (p_id)
);
INSERT INTO PERSON VALUES (11, 'John', to_date('12/12/12', 'dd/mm/yy'));
INSERT INTO PERSON VALUES (22, 'Maria', to_date('01/01/01', 'dd/mm/yy'));
INSERT INTO PERSON VALUES (33, 'Philip', to_date('02/02/02', 'dd/mm/yy'));
INSERT INTO STUDENT VALUES (98, 11, 'A');
INSERT INTO TEACHER VALUES (1234, 11, 14809510);
如何防止 Person 11 (John) 出现在两个表中?
【问题讨论】:
-
这看起来像 Oracle SQL。你真的在使用 sql-server(这个脚本会失败)吗?
-
我忘记在上面的案例中输入 VALUES 了,但现在已经更正了。绝对适合我,但问题仍然存在。 SQL-SERVER SCREENSHOT
-
sql-server 中没有
to_date()。您的屏幕截图看起来像 Oracle 的sql*plus命令行实用程序。我正在标记您的问题oracle,请随时回滚。 -
好电话,我不知道 sql-server 和 sql*plus 之间有什么区别。
-
您使用的术语表明您可能会使用对象而不是普通表。准确地包括(在问题中)你被要求做的事情 - 以及为什么你认为你所拥有的东西是错误的,这可能会有所帮助。
标签: sql oracle inheritance subtype supertype