一、表继承
- 父表与子表的关系,表访问权限并不会自动继承。
- 当在父表上查询数据的时候,想要知道那些出自于主表,哪些出自于继承表。可以利用tableoid,来标识数据来自于那一个表,然后再通过tableoid在pg_class表中找到对用的表 。
- 在postgresql里,一个表可以从零个或者多个其它表中继承属性,而且一个查询既可以引用一个表中的所有行,也可以引用一个表及其所有后代表的行。
- 子表会继承父表的所有属性
- 当我们向子表中插入数据的时候,父表中也会增加一条数据。
- 所有父表的检查约束和非空约束都会自动被子表继承。不过其他类型的约束(唯一,主键,外键约束)不会被继承。继承的一个严重局限性是索引(包括唯一约束)和外键约束只能用于单个表,而不能包括他们的子表。
- 如果需要继承主键和约束条件,索引等,则需要在创建的时候加上Including all
-
create table md_table_01(like md_table including all) inherits (md_table);
- 表继承通常使用 inherits 子句的 create table语句定义。
- 一个继承链可以使用带 no inherit 的 alter table 命令从子表上删除。
-
alter table md_table_01 no inherit md_table;
- 任何存在子表的父表都不能被删除,子表中任何从父表继承的字段或约束也不能被删除或修改。
- 删除一个表以及其所有后代,最简单的方式是使用cascade选项删除父表。
drop table md_table cascade;
二、ddl
1、继承案例
父表:
CREATE TABLE
ods_v2_yy_01_z82remrsd2
(
id CHARACTER VARYING(32) NOT NULL,
mm_id CHARACTER VARYING(32) NOT NULL,
md_name CHARACTER VARYING(64) NOT NULL,
alias_md_name CHARACTER VARYING(128) NOT NULL,
dw_md_name CHARACTER VARYING(63) NOT NULL,
md_type CHARACTER VARYING(32) NOT NULL,
md_attr CHARACTER VARYING(32),
CONSTRAINT pk_v2_yy_01_z82rgvsefn PRIMARY KEY (id)
);
子表:
create table ods_v2_yy_01_z82remrsd2_2021(like ods_v2_yy_01_z82remrsd2) inherits(ods_v2_yy_01_z82remrsd2);
create table ods_v2_yy_01_z82remrsd2_2022(like ods_v2_yy_01_z82remrsd2) inherits(ods_v2_yy_01_z82remrsd2);
create table ods_v2_yy_01_z82remrsd2_2023(like ods_v2_yy_01_z82remrsd2) inherits(ods_v2_yy_01_z82remrsd2);
2.只查询父表的数据,表名前面加only
select * from ods_v2_yy_01_z82remrsd2 where id>10
3. 查询全部,可以在表名加上*,也可以不加,不过写在表后面 写 乘号可以用于强调搜索额外的表。
select name,altitude from ods_v2_yy_01_z82remrsd2* where id>500;