PostgreSQL 创建继承表

PostgreSQL 支持创建继承表,一个表可以有多个继承父表,也可以有多个继承子表。表的继承关系可以动态添加和删除。

1. 创建继承表

创建表 t,作为继承父表,创建表 t1 作为继承子表,由于 t1 从表 t 继承而来,因此表 t1 包含了表 t 的所有字段,如下:

postgres=# create table t(id int, name text);
CREATE TABLE
postgres=# create table t1(age int) inherits (t);
CREATE TABLE
postgres=# \d+ t
                                     Table "public.t"
 Column |  Type   | Collation | Nullable | Default | Storage  | Stats target | Description
--------+---------+-----------+----------+---------+----------+--------------+-------------
 id     | integer |           |          |         | plain    |              |
 name   | text    |           |          |         | extended |              |
Child tables: t1
Access method: heap

postgres=# \d+ t1
                                     Table "public.t1"
 Column |  Type   | Collation | Nullable | Default | Storage  | Stats target | Description
--------+---------+-----------+----------+---------+----------+--------------+-------------
 id     | integer |           |          |         | plain    |              |
 name   | text    |           |          |         | extended |              |
 age    | integer |           |          |         | plain    |              |
Inherits: t
Access method: heap

在父表 t 中插入一行数据,该数据只能在父表中查到,在子表 t1 中无法查到,如下:

postgres=# insert into t values(1,'a');
INSERT 0 1
postgres=# select * from t;
 id | name
----+------
  1 | a
(1 row)

postgres=# select * from t1;
 id | name | age
----+------+-----
(0 rows)

在子表 t1 中插入一行数据,该数据在父表 t 和子表 t1 中都能查到,由于父表 t 没有 age 字段,age 字段的数据不出现在父表中,如下:

postgres=# insert into t1 values(2,'b',2);
INSERT 0 1
postgres=# select * from t1;
 id | name | age
----+------+-----
  2 | b    |   2
(1 row)

postgres=# select * from t;
 id | name
----+------
  1 | a
  2 | b
(2 rows)

2. 创建多级继承表

一个继承表可以有多个继承父表,也可以有多个继承子表,这是典型的多对多的关系,下面介绍如何创建多级继承表。

创建表 t1, t2 作为最上层的父表,如下:

create table t1(id int, name text);
create table t2(type int, typename text);

创建子表 t3,该表从父表 t1 和 t2 继承,如下:

create table t3(age int) inherits(t1,t2);

创建子表 t4,该表从父表 t3 和 t1 继承,因为 t3 是从 t1 继承而来,t3 与 t1 有相同的字段,这些相同的字段会自动进行合并。如下:

postgres=# create table t4(class int) inherits (t3,t1);
NOTICE:  merging multiple inherited definitions of column "id"
NOTICE:  merging multiple inherited definitions of column "name"
CREATE TABLE

3. 修改继承表的继承关系

表的继承关系可以动态进行修改,解除表的继承关系,或者给表添加新的继承关系。

解除继承关系:

表 t4 从 t3 和 t1 继承而来,解除 t4 与 t1 的继承关系,语法如下:

alter table t4 no inherit t1;

添加继承关系:

让表 t4 从 t2 继承,语法如下:

alter table t4 inherit t2;

4. 删除继承表

删除继承表与普通表的语法相同,如果是删除继承父表,则需要增加 cascade,级联删除关联的子表。如果是删除继承子表,则直接 drop table 即可删除。

删除继承子表 t4:

drop table t4;

删除继承父表 t1:

drop table t1 cascade;

文章评论

0条评论