PostgreSQL中的Object Identifier(oid)数据类型

摘要:
PostgreSQL内部使用对象标识符(OID)作为各种系统表的主键。类型oid表示对象标识符。oid类型的当前实现是无符号四字节整数。强制表OID为regclass对于数字OID的符号显示非常方便。按命名空间分组的对象的所有OID别名类型都接受模式限定的名称。通过向未使用的操作数写入NONE来标识一元运算符。

PostgreSQL在内部使用对象标识符(OID)作为各种系统表的主键。OID不会添加到用户创建的表中,除非在创建表时指定了WITH OIDS,或者启用了default_with_oids配置变量。类型oid表示对象标识符。oid还有几种别名类型:regproc,regprocedure,regoper,regoperator,regclass,regtype,regrole,regnamespace,regconfig和regdictionary。

PostgreSQL中的Object Identifier(oid)数据类型第1张

oid类型当前的实现为无符号的四字节整数。因此,它不足以在大型数据库或甚至大型单个表中提供数据库范围的唯一性。因此,不鼓励使用用户创建的表的OID列作为主键。OID最好仅用于对系统表的引用。

oid类型本身几乎没有比较的操作。但是,它可以转换为整数,然后使用标准整数运算符进行操作。(如果这样做,请注意可能存在有符号与无符号的混淆。)

除了专门的输入和输出routines之外,OID别名类型没有自己的操作。这些routines能够接受和显示系统对象的符号名称,而不是oid将使用的原始数值。别名类型允许简化对象的OID值查找。例如,要检查与表mytable相关的pg_attribute行,可以编写:

SELECT * FROM pg_attribute WHERE attrelid = 'mytable'::regclass;

而不是:

SELECT * FROM pg_attribute
  WHERE attrelid = (SELECT oid FROM pg_class WHERE relname = 'mytable');

虽然这本身看起来并不那么糟糕,但它仍然过于简单。如果在不同的模式中有多个名为mytable的表,则需要更复杂的子选择来选择正确的OID。regclass输入转换器根据模式路径设置处理表查找,因此它自动执行“正确的事情”。类似地,将表的OID强制转换为regclass对于数字OID的符号显示非常方便。

按namespace分组的对象的所有OID别名类型都接受模式限定名称,并且如果在没有限定的情况下在当前搜索路径中找不到该对象,则将在输出上显示模式限定名称。regproc和regoper别名类型只接受唯一(不过载)的输入名称,因此它们的用途有限;对于大多数用途,regprocedure或regoperator更合适。对于regoperator,通过为未使用的操作数写入NONE来标识一元运算符。

大多数OID别名类型的附加属性是依赖项的创建。如果这些类型之一的常量出现在存储的表达式(例如列默认表达式或视图)中,则会对引用的对象创建依赖关系。例如,如果列具有默认表达式nextval('my_seq'::regclass),则PostgreSQL理解默认表达式取决于序列my_seq;如果没有先删除默认表达式,系统将不会删除序列。regrole是该特性的唯一例外。此类表达式中不允许使用此类型的常量。

OID别名类型不完全遵循事务隔离规则。 计划器还将它们视为简单的常数,这可能导致次优的执行计划。

系统使用的另一种标识符类型是xid或事务(缩写为xact)标识符。这是系统列xmin和xmax的数据类型。事务标识符是32位长度的。

系统使用的第三种标识符类型是cid或命令标识符。这是系统列cmin和cmax的数据类型。命令标识符也是32位长度的。

系统使用的最后一类标识符类型是tid或元组标识符(行标识符)。这是系统列ctid的数据类型。元组ID是一对(块号,块内的元组索引),用于标识其表中行的物理位置。

免责声明:文章转载自《PostgreSQL中的Object Identifier(oid)数据类型》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Delphi笔记数据库开发Oracle字段增删改、添加约束下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

数组概述和特点

数组是相同类型数据的有序集合。数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。其中,每一个数据称作一个元素,每个元素可以通过一个索引(下标)来访问它们。数组的三个基本特点:       1. 长度是确定的。数组一旦被创建,它的大小就是不可以改变的。       2. 其元素必须是相同类型,不允许出现混合类型。       3. 数组类型可...

MySQL存储树形数据优化技笔记

1、树形结构应用场景 有时我们需要保存一些树形的数据,比如组织架构、话题讨论、知识管理、商品分类等,这些数据之间存在一种递归关系,很多开发人员想到的第一个解决方案往往是记录每个节点的父节点,例如以下的评论表。 CREATE TABLE comments (     comment_id int(10)  NOT NULL,     paren...

TensorFlow 2.0 深度学习实战 —— 浅谈卷积神经网络 CNN

前言 上一章为大家介绍过深度学习的基础和多层感知机 MLP 的应用,本章开始将深入讲解卷积神经网络的实用场景。卷积神经网络 CNN(Convolutional Neural Networks,ConvNet)是一种特殊的深度学习神经网络,近年来在物体识别、图像重绘、视频分析等多个层面得到了广泛的应用。本文将以VGG16预训练模型为例子,从人脸识别、预训练模...

计划任务中使用NT AUTHORITYSYSTEM用户和普通管理员用户有什么差别

原文地址:http://www.ynufe.edu.cn/metc/Article/ShowArticle.asp?ArticleID=805 系统管理员会碰到这种问题,为什么在更改系统登录用户password后,原先定制的计划任务都没有运行呢? 在计划任务的列表文件夹下,状态一栏被告知“因为输入了错误的password和username,计划的任务...

Mysql 修改数据库,mysql修改表类型,Mysql增加表字段,Mysql删除表字段,Mysql修改字段名,Mysql修改字段排列顺序,Mysql修改表名

对于已经创建好的表,尤其是已经有大量数据的表,如果需要对表做一些结构上的改变,我们可以先将表删除(drop),然后再按照新的表定义重建表。这样做没有问题,但是必然要做一些额外的工作,比如数据的重新加载。而且,如果有服务在访问表,也会对服务产生影响。因此,在大多数情况下,表结构的更改一般都使用alter table 语句,以下是一些常用的命令。 (1) 修改...

win7 64位 安装 VS2010 SP1 失败的解决方法

1. 系统环境:Windows Server 2008 R2(与Win7 x64系统相似),VS2010及常用办公、编程工具等软件2. 问题症状:无论是通过在线安装包还是ISO安装包安装,多次安装,都在安装过程中回滚,最终安装失败。3. 产生原因:系统安装整一年,常年使用,系统自动补丁等操作,使得原系统盘C盘40G空间告急,于是动手删除了部分C:Windo...