表继承是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 personsTable "public.persons"Column |  Type   | Modifiers
--------+---------+-----------id     | integer | not nullname   | text    | not nullage    | integer |sex    | boolean |
Indexes:"persons_pkey" PRIMARY KEY, btree (id)
Number of child tables: 1 (Use \d+ to list them.)test=# \d studentsTable "public.students"Column  |  Type   | Modifiers
----------+---------+-----------id       | integer | not nullname     | text    | not nullage      | 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 1test=# select * from students;id |  name  | age | sex | class_no
----+--------+-----+-----+----------1 | libei  |  24 | t   |        12 | guanyu |  23 | t   |        2
(2 rows)test=# select * from persons;id |  name  | age | sex
----+--------+-----+-----1 | libei  |  24 | t2 | guanyu |  23 | t
(2 rows)

修改子表“students”中的数据,在父表中也可以查到修改后的结果:

test=# update students set age=20 where name ='guanyu';
UPDATE 1test=# select * from persons;id |  name  | age | sex
----+--------+-----+-----1 | libei  |  24 | t2 | guanyu |  20 | t
(2 rows)

但向父表“persons”中插入一条数据,在子表“students”中确查不到这条数据:

test=# insert into persons values (3,'zhangfei',18,true);
INSERT 0 1test=# select * from persons;id |   name   | age | sex
----+----------+-----+-----3 | zhangfei |  18 | t1 | libei    |  24 | t2 | guanyu   |  20 | t
(3 rows)test=# select * from students;id |  name  | age | sex | class_no
----+--------+-----+-----+----------1 | libei  |  24 | t   |        12 | 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”命令不会影响到子表。此外,唯一约束、外键的作用域也不会扩大到子表上。

【PostgreSQL-9.6.3】表继承相关推荐

  1. PostgreSQL表继承

    PostgreSQL支持表继承,这是它特有的功能. 1.建表 例:创建person表作为父表,student表是继承它的子表. CREATE TABLE person (id int, name va ...

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

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

  3. ADO.NET Entity Framework如何:通过每种类型一个表继承以定义模型(实体框架)

    本主题介绍如何手动创建具有每种类型一个表继承层次结构的概念模型.每种类型一个表继承使用数据库中单独的表为继承层次结构中的每种类型维护非继承属性和键属性的数据. 说明: 建议使用 ADO.NET 实体数 ...

  4. (转)CSS样式表继承详解

    什么是css 继承? 要想了解css样式表的继承,我们先从文档树(HTML DOM)开始.文档树由HTML元素组成. 文档树和家族树类似,也有祖先.后代.父亲.孩子和兄弟^_^.这很容易理解吧,笔者在 ...

  5. PostgreSQL 快速给指定表每个字段创建索引 - 2

    标签 PostgreSQL , 索引 , 所有字段 , 并行创建单个索引 , max_parallel_maintenance_workers , 异步调用 , dblink , 并行创建多个索引 , ...

  6. rails 两表关联查询_Rails中的单表继承与多态关联:找到适合您的方法

    rails 两表关联查询 by Haley Mnatzaganian 通过海利·姆纳扎卡尼安 Rails中的单表继承与多态关联:找到适合您的方法 (Single-table inheritance v ...

  7. 在NHibernate的单表继承模式下通过父类Repository查询子类

    在NHibernate中经常遇到继承与关系数据库的ORMapping的问题,我之前的一篇博客(http://www.cnblogs.com/studyzy/archive/2011/08/16/214 ...

  8. 为什么postgresql最大的单表只能是32TB

    作者:瀚高PG实验室 (Highgo PG Lab)- 徐云鹤 为什么postgresql最大的单表只能是32TB? 这需要从数据文件来说起. 在postgresql中,一张表对应多个数据文件. 数据 ...

  9. CSS样式表继承和优先级

    CSS样式表继承 要想了解css样式表的继承,我们先从文档树(HTML DOM)开始.文档树由HTML元素组成. 文档树和家族树类似,也有祖先.后代.父亲.孩子和兄弟_. 那么CSS样式表继承指的是, ...

最新文章

  1. 9999元雷军新宠亮相!机器狗铁蛋,能走能遛能空翻,小米机器人实验室第一款产品...
  2. CSS3 flexbox 布局 ---- flex项目属性介绍
  3. bootstrap日期时间控件
  4. 力扣- -去除重复字母
  5. linux查看进程自身全路径,在linux环境下如何查看进程的全路径
  6. 漫谈OI中的群论入门
  7. webpack-dev-server
  8. php调用7天内容,如何使用JS取得最近7天与最近3天日期
  9. webui-popover 一个轻量级的jquery弹出层插件
  10. leetcode88
  11. UEditor ASP.NET 版使用教程
  12. CSS3之颜色渐变效果
  13. 幼儿园计算机网络教室工作计划,幼儿园2017-2018学年游戏教学工作计划
  14. 中国数字乳房断层合成(DBT)设备市场趋势报告、技术动态创新及市场预测
  15. yarn安装插件报错: An unexpected error occurred: “https://registry.npmjs.org/vue-router: connect ETIMEDOUT
  16. mac python3 调用 .so_Mac OS X链接.so文件到动态库
  17. 左手拿叉右手拿刀——话西餐
  18. 通过云片网实现短信以及验证码的发送
  19. 一天一看————计算机网络参数模型与5G协议!
  20. c++ 定义一个字符栈类Stack(包括类的实现)。数据成员包括一个存放字符的数组stck[ ]和一个栈指针tos。栈数组的尺寸由常量SIZE确定。栈的基本操作为Push()和Pop()。

热门文章

  1. Java设计模式透析之 —— 组合(Composite)
  2. Eclipse用法和技巧十七:覆盖父类方法
  3. 构造模式(Builder Pattern)
  4. 在图片控件中应用win32显示图片总结
  5. Qt--音乐播放器 V2.0
  6. 阿里云移动端播放器高级功能---画面控制
  7. 前嗅ForeSpider教程:配置关键词
  8. POJ3076 Sudoku
  9. 前端开发框架整理(一些记录给自己看的)
  10. 【Java基础】3、Java 位运算(移位、位与、或、异或、非)