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条评论