继承表
继承表、分区表,不同,但是又有很多相同的地方。
表继承(Table Inheritance)是PostgreSQL的独有特性,很多数据库(如MySQL)是不支持该特性的。SQL:1999及之后的标准定义了类型继承特性,不过PostgreSQL的表继承在很多方面与它有差异。
类似于编程语言中的继承概念。
创建父表
CREATE TABLE vehicles(
name text PRIMARY KEY,--车辆名字
color text, --车身颜色
weight float, --车身重量
area text, --产地
manufacturerid int --制造商标识
);
子表,继承父表
CREATE TABLE bikes (
size FLOAT NOT NULL -- 车架尺寸
) INHERITS (vehicles);
CREATE TABLE cars (
displacement FLOAT NOT NULL --排量
) INHERITS (vehicles);
CREATE TABLE trucks (
load FLOAT NOT NULL --最大载重
) INHERITS (vehicles);
执行成功,但是会有如下提示:
NOTICE: table has parent, setting distribution columns to match parent table
插入数据:
insert into bikes values('bike002','RED',35,'重庆',1002,1);
insert into bikes values('bike003','YELLOW',30,'重庆',1002,2);
insert into trucks values('truck002','RED',1055,'重庆',1002,3);
insert into cars values('truck002','RED',1055,'重庆',1002,4);
对仅操作父表的内容时,则需要指定ONLY关键字。
但是insert操作并不支持,因为它并不知道,你要查到哪个字表。
-- 只查父表的内容
SELECT FROM ONLY vehicles;
-- 查父表、子表的内容
SELECT * FROM vehicles;
-- 删除
DELETE FROM vehicles WHERE name LIKE 'truck%'s;
-- 插入,指定不同的表名,插入不同的表中
-- 更新父表和子表
UPDATE vehicles SET weight=1160 WHERE name='truck002';
-- 只更新父表
UPDATE ONLY vehicles SET weight=1160 WHERE name='truck002';
继承约束关系
如果父表设置了一些约束(Constraints),如检查约束(Check)、非空约束(Not-Null)、唯一约束(Unique)、主键约束(Primary Keys)、外键约束(Foreign Keys)、排他约束(Exclusion),那么子表是否会自动继承这些约束呢?答案是,子表只会继承检查约束和非空约束,其他约束都不会被继承。