zip*_*ver 4 postgresql inheritance parent-child
我想知道如何在PostgreSQL(9.4)中的父表和子表之间轻松移动数据,反之亦然.
假设我有以下数据库示例设置:
DROP TABLE IF EXISTS employee CASCADE;
DROP TABLE IF EXISTS director CASCADE;
CREATE TABLE employee(
id SERIAL PRIMARY KEY NOT NULL,
name VARCHAR(255) NOT NULL,
surname VARCHAR(255) NOT NULL,
employment_date DATE NOT NULL DEFAULT CURRENT_DATE
);
CREATE TABLE director(
director_id SERIAL PRIMARY KEY NOT NULL,
secretary_id INT4 REFERENCES employee(id),
extra_legal_benefits VARCHAR(255) ARRAY
) inherits (employee);
INSERT INTO employee(name, surname)
VALUES ('Alice', 'Alisson');
INSERT INTO employee(name, surname)
VALUES ('Bob', 'Bobson');
INSERT INTO employee(name, surname)
VALUES ('Carol', 'Clarckson');
INSERT INTO director(name, surname, secretary_id, extra_legal_benefits)
VALUES ('David', 'Davidson', 1, '{car, travel expenses}');
Run Code Online (Sandbox Code Playgroud)
如何将其中一名员工(移动)提升到导演表(必须不再出现在父母中)?
我如何将其中一位董事降级(移动)回员工表(必须不再在孩子身上)?
促进员工:
with deleted as (
delete from only employee
where name = 'Carol'
returning *
)
insert into director (name, surname, secretary_id, extra_legal_benefits)
select name, surname, null, '{flight}'
from deleted;
Run Code Online (Sandbox Code Playgroud)
然而:
必须不再出现在父级中
根据定义,子表中的任何行都可在父表中使用.如果only在从employee表中选择时使用谓词,则只能"隐藏"这些行:
select *
from only employee;
Run Code Online (Sandbox Code Playgroud)
以上内容不会显示也是董事的员工.select * from employee然而,平原将显示所有名称(但你无法区分它们 - 这是继承的本质).
降级导演:
with deleted as (
delete from only director
where name = 'David'
returning *
)
insert into employee (name, surname)
select name, surname
from deleted;
Run Code Online (Sandbox Code Playgroud)
但说实话,我可能会通过员工实体上的附加列(如position或role)来模拟这个,而不是使用继承.甚至与position(或role)实体的多对多关系,因为员工具有多个角色并不罕见,例如在不同的部门,团队或其他环境中.