Oracle SQL 查询子类-table - 继承
Oracle SQL queries for subclass-table - Inheritance
我有一个 Staff
table 以 staffNo
作为主键
以及从它继承的另外两个 table 中的工作人员详细信息:FTLecturer
和 PTLecturer
。我在那里使用了 Optional Or
关系。
我的问题是:如何为这些子类编写Oracle SQL查询?
我认为我不再需要为他们进行 PK,因为他们继承自“Staff”。是这样吗?
这是Staff
table
CREATE TABLE Staff
(staffNo number(10) NOT NULL,
firstName varchar2(50) NOT NULL,
lastName number(2) ,
address varchar2(50) NOT NULL,
CONSTRAINT courseID_pk PRIMARY KEY (staffNo),
CONSTRAINT fk_Module
FOREIGN KEY (moduleID)
REFERENCES Module(Module Module ID)
);
我需要创建 FTLecturer
table 与 Optional Or
关系。
继承是Object-Oriented编程中的一个概念:它在关系数据库中没有意义。这样做最重要的影响是 child table 确实需要一个主键。
"I need to create the FTLecturer table with the Optional Or relationship."
您所描述的在关系数据库中称为 Arc:讲师可以是 full-time 或 part-time,但不能同时是两者。我们可以通过一组合适的约束来强制执行此操作。
首先在parent table中添加一列来标识讲师类型。
alter table staff add staffType varchar2(10);
这应该使用针对参考数据的外键进行验证 table,并在紧要关头检查约束。然后我们添加一个唯一约束(是的,还有一个主键):
alter table staff add constraint staff_uk unique(staffNo, staffType);
我们可以用它来强制 child table 上的弧线。
create table FTLecturer (
staffNo number not null,
staffType varchar2(10) not null,
tenure varchar2(3) not null,
constraint FTLecturer_pk primary key (staffNo),
constraint FTLecturer_ck check (staffType = 'FTL'),
constraint FTLecturer_Staff_fk foreign key (staffNo, staffType)
references staff (staffNo, staffType);
请注意,外键意味着我们只能在此 table 中插入具有 STAFF table 中正确类型的 parent 的行。这就是为什么我们需要 StaffType
列和对 STAFF table 的唯一约束。
同样 Part-Time 讲师:
create table PTLecturer (
staffNo number not null,
staffType varchar2(10) not null,
hours number not null,
constraint PTLecturer_pk primary key (staffNo),
constraint PTLecturer_ck check (staffType = 'PTL'),
constraint PTLecturer_Staff_fk foreign key (staffNo, staffType)
references staff (staffNo, staffType);
从 Oracle 11g 开始,我们可以使用虚拟列为 child table 上的 staffType 应用常量值。这避免了对检查约束的需要。 Find out more.
要为特定员工创建记录,最好在同一操作中填充 parent 和 child;我们可以使用 INSERT ALL 语法来填充多个 table。 Find out more.
最后,您可以构建一个有用的 API 视图。例如:
create or replace view fulltimeLecturer as
select staff.*
, ftl.tenure
from staff
join ftlecturer ftl
on staff.staffno = ftl.staffno
and staff.stafftype = ftl.stafftype;
create or replace view parttimeLecturer as
select staff.*
, ptl.hours
from staff
join ptlecturer ptl
on staff.staffno = ptl.staffno
and staff.stafftype = ptl.stafftype;
这可能会让您觉得工作量很大,而且启动起来不够灵活。这是 Object 编程和关系数据库之间的区别。 OOP 主要是通过帮助开发人员编写代码来驱动的; RDBMS 专注于保证存储数据的完整性。
我有一个 Staff
table 以 staffNo
作为主键
以及从它继承的另外两个 table 中的工作人员详细信息:FTLecturer
和 PTLecturer
。我在那里使用了 Optional Or
关系。
我的问题是:如何为这些子类编写Oracle SQL查询? 我认为我不再需要为他们进行 PK,因为他们继承自“Staff”。是这样吗?
这是Staff
table
CREATE TABLE Staff
(staffNo number(10) NOT NULL,
firstName varchar2(50) NOT NULL,
lastName number(2) ,
address varchar2(50) NOT NULL,
CONSTRAINT courseID_pk PRIMARY KEY (staffNo),
CONSTRAINT fk_Module
FOREIGN KEY (moduleID)
REFERENCES Module(Module Module ID)
);
我需要创建 FTLecturer
table 与 Optional Or
关系。
继承是Object-Oriented编程中的一个概念:它在关系数据库中没有意义。这样做最重要的影响是 child table 确实需要一个主键。
"I need to create the FTLecturer table with the Optional Or relationship."
您所描述的在关系数据库中称为 Arc:讲师可以是 full-time 或 part-time,但不能同时是两者。我们可以通过一组合适的约束来强制执行此操作。
首先在parent table中添加一列来标识讲师类型。
alter table staff add staffType varchar2(10);
这应该使用针对参考数据的外键进行验证 table,并在紧要关头检查约束。然后我们添加一个唯一约束(是的,还有一个主键):
alter table staff add constraint staff_uk unique(staffNo, staffType);
我们可以用它来强制 child table 上的弧线。
create table FTLecturer (
staffNo number not null,
staffType varchar2(10) not null,
tenure varchar2(3) not null,
constraint FTLecturer_pk primary key (staffNo),
constraint FTLecturer_ck check (staffType = 'FTL'),
constraint FTLecturer_Staff_fk foreign key (staffNo, staffType)
references staff (staffNo, staffType);
请注意,外键意味着我们只能在此 table 中插入具有 STAFF table 中正确类型的 parent 的行。这就是为什么我们需要 StaffType
列和对 STAFF table 的唯一约束。
同样 Part-Time 讲师:
create table PTLecturer (
staffNo number not null,
staffType varchar2(10) not null,
hours number not null,
constraint PTLecturer_pk primary key (staffNo),
constraint PTLecturer_ck check (staffType = 'PTL'),
constraint PTLecturer_Staff_fk foreign key (staffNo, staffType)
references staff (staffNo, staffType);
从 Oracle 11g 开始,我们可以使用虚拟列为 child table 上的 staffType 应用常量值。这避免了对检查约束的需要。 Find out more.
要为特定员工创建记录,最好在同一操作中填充 parent 和 child;我们可以使用 INSERT ALL 语法来填充多个 table。 Find out more.
最后,您可以构建一个有用的 API 视图。例如:
create or replace view fulltimeLecturer as
select staff.*
, ftl.tenure
from staff
join ftlecturer ftl
on staff.staffno = ftl.staffno
and staff.stafftype = ftl.stafftype;
create or replace view parttimeLecturer as
select staff.*
, ptl.hours
from staff
join ptlecturer ptl
on staff.staffno = ptl.staffno
and staff.stafftype = ptl.stafftype;
这可能会让您觉得工作量很大,而且启动起来不够灵活。这是 Object 编程和关系数据库之间的区别。 OOP 主要是通过帮助开发人员编写代码来驱动的; RDBMS 专注于保证存储数据的完整性。