postgresql表中的系统字段(一)

对象标识类型

类型名称引用描述
oid任意数字化的对象标识符
regprocpg_proc函数名
regprocedurepg_proc带参数类型的函数
regoperpg_operator操作符名
regoperatorpg_operator带参数类型的操作符名
regclasspg_class表名或索引名
regtypepg_type数据类型名
regconfigpg_ts_config全文索引配置
regdictionarypg_ts_dict全文索引路径
概念

oid:各种系统表的主键,在postgresql内部使用的对象标识符。用户建表可以使用with oids创建oid,但官方不建议使用,建议oid只用于系统表。

ctid:表示数据行在它所处的表内的物理位置,ctid会随着vacuum full操作改变。ctid由两个数字组成(物理块,行号)。

xmin:标记插入数据行的事务id
xmax:标记删除数据行的事务id
cmin和cmax用于判断同一事务内的不同命令导致行版本的变化是否可见

pg修改前后的数据存储在相同结构中,分为以下几种情况:

  • 新插入一行时,将新插入行的xmin填写为当前的事务ID,xmax填0
  • 修改这一行时,实际上新插入一行,原数据行上xmin不变,xmax改为当前的事务ID,新数据行上的xmin填写为当前的事务ID,xmax填0
  • 删除一行时,把被删除行上的xmax填写当前的事务ID
    (没有修改数据行的操作,因为修改数据行,实际上就是把原数据行上的xmax标记上自己的事务ID即相当于打上删除标记,然后再新插入一条记录)
##查看标识符为1259为那张表
select 1259::regclass;

##查看系统表有哪些字段
select attrelid,attname,atttypid,attlen,attnum,attnotnull
from pg_attribute
where attrelid='t'::regclass;

ps:
attrelid='t'::regclass 等价 select oid from pg_class where relname='t';

##利用ctid删除表重复的数据
delete from tb_name as a
where a.ctid <> (select min(b.ctid) from tb_name as b where a.id=b.id)
(适用表数据比较少的情况)

delete from tb_name 
where ctid = any(array(select ctid from (select row_number() over (partition by id ),ctid from tb_name) x where x.row_number >1));
(适用于表数据量比较大的情况)

资料参考来源:《PostgreSQL修炼之道从小工到专家 第2版》唐成著 机械工业出版社
仅学习非商业用途

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值