每个表有如下几个内置的列:
oid tableoid xmin cmin xmax cmax ctid
其中:tableoid xmin cmin xmax cmax ctid这几列是一定会有的,用户不能使用他们来作为列名,而oid却是可以用来作为列名的,前提是要将表定义为非oid表:
WITH (
OIDS = FALSE
)
如果该表所继承的表中,有任何一个表有OID,则该表将被强制使用OID,而不管SQL中的关于OID的定义;
推荐禁用OID(推荐使用一个serial类型的列作为主键),有几个好处:
1、可以节省计算PID的CPU开销,以及磁盘上的IO开销(虽然节省的不是很多)
2、OID是一个32或者64位的一个计数器,当到达其可以表示的最大值后,又会循环重新从0开始计数,这样会导致产生重复的值,使其违反了唯一标识某一行的初衷
但是如果你没有在表上定义主键,则建议开启,并且在其上创建唯一性索引(避免因为计数超过了其能够表示的最大值,然后循环回来产生重复值)这样它可以保证表上始终有一个唯一性的主键,这样可以在一些场合中利用这个唯一主键值提高性能
一个表的列数不能超过1600.
可以定义一个组合类型:
create type t_rank as(
"salary" double precision, "level" smallint
);
然后,基于这个组合类型,定义一个表:
create table testdbschema1.employee of t_rank;
但是这种基于自定义类型的表,是不能再自定义列了,其列将完全依照类型的定义;
查询组合类型:
select * from pg_type where typtype = 'c' and typarray > 0
AND typname NOT IN (SELECT TABLE_NAME FROM information_schema.tables)
order by typname
查询所有表:
select * from information_schema.tables where table_Catalog = 'testdb1' and table_schema='testdbschema1'
表可以继承多个表,这时候将自动继承父表的所有列,并且父表中某个字段数据更新,子表也随之更新,其实就是数据都存放在父表中。如果多个父表,有类型相同的同名字段,则会报错。