表继承是PostgreSQL特有的,子表可以从父表中继承字段和一些属性。例如:

--创建一张表“persons”作为父表:

test=# create table persons (
test(# id int primary key,
test(# name text not null,
test(# age int,
test(# sex boolean
test(# );
CREATE TABLE --创建子表“students”,students表比persons表多一个字段“class_no”: test=# create table students (
test(# class_no int
test(# ) inherits (persons);
CREATE TABLE --查看“persons”,“students”的表结构: test=# \d persons
Table "public.persons"
Column | Type | Modifiers
--------+---------+-----------
id | integer | not null
name | text | not null
age | integer |
sex | boolean |
Indexes:
"persons_pkey" PRIMARY KEY, btree (id)
Number of child tables: 1 (Use \d+ to list them.) test=# \d students
Table "public.students"
Column | Type | Modifiers
----------+---------+-----------
id | integer | not null
name | text | not null
age | integer |
sex | boolean |
class_no | integer |
Inherits: persons --向子表“students”中插入两条记录,插入成功后,在父表中也可以查到这两条记录: test=# insert into students values (1,'libei',24,true,1);
INSERT 0 1
test=# insert into students values (2,'guanyu',23,true,2);
INSERT 0 1 test=# select * from students;
id | name | age | sex | class_no
----+--------+-----+-----+----------
1 | libei | 24 | t | 1
2 | guanyu | 23 | t | 2
(2 rows) test=# select * from persons;
id | name | age | sex
----+--------+-----+-----
1 | libei | 24 | t
2 | guanyu | 23 | t
(2 rows) --修改子表“students”中的数据,在父表中也可以查到修改后的结果: test=# update students set age=20 where name ='guanyu';
UPDATE 1 test=# select * from persons;
id | name | age | sex
----+--------+-----+-----
1 | libei | 24 | t
2 | guanyu | 20 | t
(2 rows) --但向父表“persons”中插入一条数据,在子表“students”中确查不到这条数据: test=# insert into persons values (3,'zhangfei',18,true);
INSERT 0 1 test=# select * from persons;
id | name | age | sex
----+----------+-----+-----
3 | zhangfei | 18 | t
1 | libei | 24 | t
2 | guanyu | 20 | t
(3 rows) test=# select * from students;
id | name | age | sex | class_no
----+--------+-----+-----+----------
1 | libei | 24 | t | 1
2 | guanyu | 20 | t | 2
(2 rows)

总结:当查询父表时,会把子表中的数据也查询出来,反之则不行。如果只想查询父表自己的数据,在表名前加“only”即可:

test=# select * from only persons;
id | name | age | sex
----+----------+-----+-----
3 | zhangfei | 18 | t
(1 row)

所有父表的检查约束和非空约束都会被子表继承过来,其他类型的约束比如:唯一、主键、外键,则不会被继承。

一个子表可以从多个父表中继承,子表将拥有所有父表的列和自己定义的列。如果同一个字段名出现在多个父表中,或者同时出现在父表和子表的定义中,那么这些字段将会被“融合”,因此在子表中就只有一个这样的字段。但是这种“融合”要求字段的数据类型相同,否则会报错。融合的字段拥有父表字段的所有检查约束。

采用select、update、delete等命令操作父表时,也会同时操作相应的子表,当使用alter table修改父表的表结构时,也会同时修改子表的表结构,但“reindex”、“vacuum”命令不会影响到子表。此外,唯一约束、外键的作用域也不会扩大到子表上。

The End!

【PostgreSQL-9.6.3】表继承的更多相关文章

  1. [转] PostgreSQL学习手册(数据表)

    from: http://www.cnblogs.com/stephen-liu74/archive/2012/04/23/2290803.html 一.表的定义: 对于任何一种关系型数据库而言,表都 ...

  2. PostgreSQL学习手册(数据表)<转>

    一.表的定义: 对于任何一种关系型数据库而言,表都是数据存储的最核心.最基础的对象单元.现在就让我们从这里起步吧.    1. 创建表:    CREATE TABLE products (      ...

  3. CSS样式表继承详解

    最近在恶补css样式表的基础知识.上次研究了css样式表之冲突问题详解 .这次是对 css 继承 特性的学习. 什么是css 继承?要想了解css样式表的继承,我们先从文档树(HTML DOM)开始. ...

  4. PostgreSQL数据库中获取表主键名称

    PostgreSQL数据库中获取表主键名称 一.如下表示,要获取teacher表的主键信息: select pg_constraint.conname as pk_name,pg_attribute. ...

  5. ActiveRecord-连接多张表之单表继承

    ActiveRecord-连接多张表之单表继承 1. 基本概念 Rails提供了两种机制,可以将复杂的面向对象模型映射为关系模型,即所谓的单表继承(single-table inheritance)和 ...

  6. python flask_sqlalchemy 多态 polymorphic 实现单表继承

    sqlalchemy 多态 polymorphic 实现单表继承 sqlaclchemy中的单表继续就是以一个模型类为基类,其他模型类继承基类,所有模型类的的数据都存一张表里面(也可以是多张,只不过基 ...

  7. postgresql 表继承

    可以按如下语句创建表 CREATE TABLE capitals ( name text, population real, altitude int, -- (in ft) state ) ); C ...

  8. PostgreSQL中使用外部表

    1. 安装file_fdw 需要先安装file_fdw,一般是进到PostgreSQL的源码包中的contrib/file_fdw目录下,执行: make make install 然后进入数据库中, ...

  9. 对PostgreSQL中 pg_各表的RelationId的认识

    读取普通的table或者系统表,都会调用heap_open函数: /* ---------------- * heap_open - open a heap relation by relation ...

随机推荐

  1. 远程连接Ubuntu的桌面

    参考:http://www.linuxidc.com/Linux/2016-06/132442.htm http://teliute.org/linux/TeUbt/lesson52/lesson52 ...

  2. 创建序列化器,序列化管理器,closureSerializer

    创建序列化器,序列化管理器,closureSerializer //通过反射创建序列化对象 // Create an instance of the class with the given name ...

  3. PL/SQL Challenge 每日一题:2014-3-14 11gR2中带RELIES_ON子句的RESULT_CACHE函数

    PL/SQL Challenge 每日一题:2014-3-14 11gR2中带RELIES_ON子句的RESULT_CACHE函数 最先答对且答案未经编辑的puber将获得纪念章一枚(答案不可编辑但可 ...

  4. 1393 0和1相等串 51nod

    1393 0和1相等串 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题  收藏  关注 给定一个0-1串,请找到一个尽可能长的子串,其中包含的0与1的个数相等. I ...

  5. 开源GIS软件 4

    空间数据操作框架 Apache SIS Apache SIS 是一个空间的框架,可以更好地搜索,数据聚类,归档,或任何其他相关的空间坐标表示的需要. kvwmap kvwmap是一个采用PHP开发的W ...

  6. MyEclipse10及插件安装教程(附安装包和破解文件)

    MyEclipse10安装包+破解文件:MyEclipse10安装包.MyEclipse10破解文件MyEclipse10安装包地址:http://pan.baidu.com/s/1pJrCLB1My ...

  7. 【Hibernate学习】 ——ORM(四)再次认识实体继承

    在信用办时.做失信.守信.黑名单这一块的时候.先把原来的需求看了看.紧接着就開始设计实体,这一块大部分都是同样的信息,所以就设计了一个实体,而且用一个状态标识出来是失信.守信还是黑名单. 在之后的改动 ...

  8. 民意调查Django实现(三)

    我们接着第二小节的開始继续我们的旅程. 我们会继续Web-poll应用.而且将会专注于创建公共接口 - "Views". 哲学思想 一个视图是你的Django应用中的一个Web页面 ...

  9. It&#39;s not a Bug, It&#39;s a Feature! (poj 1482 最短路SPFA+隐式图+位运算)

    Language: Default It's not a Bug, It's a Feature! Time Limit: 5000MS   Memory Limit: 30000K Total Su ...

  10. JS0基础学习笔记(1)

    为了须要,最近開始学习JS相关知识.基本的方式是通过看视频以及查阅相关手冊.并动手实践,亲手写出每一个小案例,以下是相关代码(每一个案例用分隔线隔开). <!DOCTYPE html> & ...