表的继承

建父表

CREATE TABLE persons
(
name text,
age int,
sex BOOLEAN
);

建子表

CREATE TABLE students (
class_no INT
) INHERITS (persons);

插入数据

  • 向子表插入数据
insert into students values('张三', 15,true,1);
insert into students values('李四', 15,false,2);
  • 向父表插入数据
insert into persons values('王五',18,true)

查询数据

  • 查询父表
select * from persons;

结果

  • 查询子表
select * from students;

结果

  • 只查询父表中的数据(使用关键字only)
select * from only persons;

结果

其他注意事项

  • 父表的检查约束与非空约束会从遗传到子表中,但是其他类型的约束(唯一、主键、外键)则不会被子表继承;
  • 一个子表可以从多个父表继承,此时他会用用所有父表的字段总和,并且子表中定义的字段也会还在
  • 如果同名字段出现在一个表继承的多个父表中,那么这些字段就会“融合”,因此,子表中就之后有一个这样的字段
    • 但是融合的条件是父表中的同名字段类型必须相同,否则会抛出一个错误;
    • 融合的字段会拥有父表中该字段的所有检查约束;
    • 并且如果某个父表字段存在非空约束,那么融合后的字段也必须是非空的;
  • 采用select、update、delete等命令访问或操作一张父表时, 也会同时操作相应的子表;
  • 而使用alter table命令修改一张父表的结构定义时,大多时候也会修改子表的结构定义;
  • reindex、vacuum命令不会影响到子表
  • 唯一约束、外键的使用域也不会扩大到子表上

多说一句

继承特性的一个严重的局限性是索引(包括唯一约束)和外键约束只施用于单个表,而不包括它们的继承的子表。这一点不管对引用表还是被引用表都是事实,因此在上面的例子里,如果我们声明cities.name为UNIQUE或者是一个PRIMARY KEY,那么也不会阻止capitals表拥有重复了名字的cities数据行。 并且这些重复的行缺省时在查询cities表的时候会显示出来。实际上,缺省时capitals将完全没有唯一约束,因此可能包含带有同名的多个行。你应该给capitals增加唯一约束,但是这样做也不会避免与cities的重复。类似,如果我们声明cities.name REFERENCES某些其它的表,这个约束不会自动广播到capitals。在这种条件下,你可以通过手工给capitals 增加同样的REFERENCES约束来做到这点。

参考:
http://www.cnblogs.com/stephen-liu74/archive/2012/04/27/2291814.html

posted @ 2018-10-23 20:25  岳麓丹枫  阅读(170)  评论(0编辑  收藏  举报