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

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)数据类型的更多相关文章

  1. PostgreSQL 中定义自己需要的数据类型

    PostgreSQL解决某系数据库中的tinyint数据类型问题,创建自己需要的数据类型如下: CREATE DOMAIN tinyint AS smallint CONSTRAINT tinyint ...

  2. ASN.1 Encode an Object Identifier (OID) with OpenSSL

    OID(Object Identifier) denotes an object. Examples: ------------------------------------------------ ...

  3. PostgreSQL中标准的SQL boolean数据类型

  4. Postgresql中的large object

    1.初识postgresql large object 一位同事在对使用pg_dump备份出来的文件(使用plain格式)进行恢复时,觉得速度非常慢,让我分析一下是什么原因. 我拿到他的.bak文件, ...

  5. Postgresql中的数据类型大全

    一.数值类型: 下面是PostgreSQL所支持的数值类型的列表和简单说明: 名字 存储空间 描述 范围 smallint 2 字节 小范围整数 -32768 到 +32767 integer 4 字 ...

  6. golang自己定义数据类型查询与插入postgresql中point数据

    golang自己定义数据类型查询与插入postgresql中point数据 详细代码例如以下: package main import ( "bytes" "databa ...

  7. PostgreSQL 中日期类型转换与变量使用及相关问题

    PostgreSQL中日期类型与字符串类型的转换方法 示例如下: postgres=# select current_date; date ------------ 2015-08-31 (1 row ...

  8. C#部分---arraylist集合、arraylist集合中的object数据转换成int类string类等;间隔时间的表示方法;

    ArrayList和Array的区别: 相同点:1.两者都实现了IList.ICollection.IEnumerable接口:       2.两者都可以使用证书索引访问集合中的元素,包括读取和赋值 ...

  9. python 中的object与type的关系

    object 和 type的关系很像鸡和蛋的关系,先有object还是先有type没法说,obejct和type是共生的关系,必须同时出现的. 在看下去之前,也要请先明白,在Python里面,所有的东 ...

随机推荐

  1. easyui datagrid treegrid 取消行选中、取消高亮

    .datagrid-row-selected{ background: #FFFFFF !important; color: #404040; } 一.思路来源:https://www.cnblogs ...

  2. 【Tomcat】虚拟主机

    <Host name="localhost" appBase="webapps" unpackWARs="true" autoDepl ...

  3. nodejs puppeteer linux(centos)环境部署以及用puppeteer简单截图

    1.安装Node环境 如果有安装Node请忽略第1点 #下载cd /usr/local/srcwget https://nodejs.org/dist/v10.15.3/node-v10.15.3-l ...

  4. static 关键字在java语言中的特性

    ​ 一,将自己注入到一个静态变量中实现静态类,如下写法 以上方法的目的是要实现一个静态类,方便用类名获取对象实例,一般情况下调用普通方法需要对象实例.这对象要么new出来,要么spring的注入如下是 ...

  5. C语言开发具有可变长参数的函数的方法

    学习交流可加 微信读者交流①群 (添加微信:coderAllen) 程序员技术QQ交流①群:736386324 --- 前提:ANSI C 为了提高可移植性, 通过头文件stdarg.h提供了一组方便 ...

  6. MySQL/MariaDB数据库的PROXY实现读写分离

    MySQL/MariaDB数据库的PROXY实现读写分离 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.ProxySQL概述 1>.各家互联网公司读写分离的解决方案 m ...

  7. MySQL/MariaDB数据库的并发控制

    MySQL/MariaDB数据库的并发控制 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.并发控制概述 1>.什么是并发控制 MySQL是一个服务器级别的数据库,它通常 ...

  8. OpenStack核心组件-nova计算服务

    1. nova介绍 Nova 是 OpenStack 最核心的服务,负责维护和管理云环境的计算资源.OpenStack 作为 IaaS 的云操作系统,虚拟机生命周期管理也就是通过 Nova 来实现的. ...

  9. CentOS Linux更改MySQL数据库目录位置

    引言: 由于MySQL的数据库太大,默认安装的/var盘已经再也无法容纳新增加的数据,没有办法,只能想办法转移数据的目录. 下面我整理一下把MySQL从/var/lib/mysql目录下面转移到/ho ...

  10. 小程序页面收录 sitemap

    微信现已开放小程序内搜索,你的小程序页面将可能展示在微信搜索等多个公开场景中.当开发者允许微信索引时,微信会通过爬虫的形式,为小程序的页面内容建立索引. 若小程序中存在不适合展示信息如用户个人信息.商 ...