Postgres表继承:从父级移动到子级,反之亦然

时间:2015-04-08 08:06:28

标签: 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}');

如何将其中一名员工提升(移动)到导演员表(必须不再出现在家长中)?

我如何将其中一位董事降级(移动)回员工表(必须不再在孩子身上)?

1 个答案:

答案 0 :(得分:6)

宣传员工:

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;

然而:

  

必须不再出现在父

子表中的任何行都可以在父表中找到。你只能隐藏"从employee表中选择时使用谓词only的那些行:

select *
from only employee;

上述内容不会显示也是董事的员工。一个简单的select * from employee但是显示所有名称(但你无法区分它们 - 这是继承的本质)。


降级导演:

with deleted as (
  delete from only director 
  where name = 'David'
  returning *
)
insert into employee (name, surname)
select name, surname
from deleted;

但说实话,我可能会通过员工实体上的其他专栏(如positionrole)对此进行建模,而不是使用继承。甚至与position(或role)实体的多对多关系,因为员工具有多个角色的情况并不少见,例如在不同的部门,团队或其他环境中。