继承表

继承表、分区表,不同,但是又有很多相同的地方。

表继承(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),那么子表是否会自动继承这些约束呢?答案是,子表只会继承检查约束和非空约束,其他约束都不会被继承。