PostgreSQL中的Object Identifier(oid)数据类型
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)数据类型的更多相关文章
- PostgreSQL 中定义自己需要的数据类型
PostgreSQL解决某系数据库中的tinyint数据类型问题,创建自己需要的数据类型如下: CREATE DOMAIN tinyint AS smallint CONSTRAINT tinyint ...
- ASN.1 Encode an Object Identifier (OID) with OpenSSL
OID(Object Identifier) denotes an object. Examples: ------------------------------------------------ ...
- PostgreSQL中标准的SQL boolean数据类型
- Postgresql中的large object
1.初识postgresql large object 一位同事在对使用pg_dump备份出来的文件(使用plain格式)进行恢复时,觉得速度非常慢,让我分析一下是什么原因. 我拿到他的.bak文件, ...
- Postgresql中的数据类型大全
一.数值类型: 下面是PostgreSQL所支持的数值类型的列表和简单说明: 名字 存储空间 描述 范围 smallint 2 字节 小范围整数 -32768 到 +32767 integer 4 字 ...
- golang自己定义数据类型查询与插入postgresql中point数据
golang自己定义数据类型查询与插入postgresql中point数据 详细代码例如以下: package main import ( "bytes" "databa ...
- PostgreSQL 中日期类型转换与变量使用及相关问题
PostgreSQL中日期类型与字符串类型的转换方法 示例如下: postgres=# select current_date; date ------------ 2015-08-31 (1 row ...
- C#部分---arraylist集合、arraylist集合中的object数据转换成int类string类等;间隔时间的表示方法;
ArrayList和Array的区别: 相同点:1.两者都实现了IList.ICollection.IEnumerable接口: 2.两者都可以使用证书索引访问集合中的元素,包括读取和赋值 ...
- python 中的object与type的关系
object 和 type的关系很像鸡和蛋的关系,先有object还是先有type没法说,obejct和type是共生的关系,必须同时出现的. 在看下去之前,也要请先明白,在Python里面,所有的东 ...
随机推荐
- RSA加密&解密【Java&Scala】
一.简介 RSA加密算法是一种非对称加密算法.在公开密钥加密和电子商业中RSA被广泛使用. RSA公开密钥密码体制.所谓公开密钥密码体制就是使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解 ...
- SpringBoot集成MyBatis的分页插件PageHelper--详细步骤
1.pom中添加依赖包 <!--pageHelper基本依赖 --> <dependency> <groupId>com.github.pagehelper< ...
- 分布式数据库中间件、产品——sharding-jdbc、mycat、drds
一般对于业务记录类随时间会不断增加的数据,当数据量增加到一定量(一般认为整型值为主的表达到千万级,字符串为主的表达到五百万)的时候,性能将遇到瓶颈,同时调整表结构也会变得非常困难.为了避免生产遇到这样 ...
- 蓝桥杯-基础练习 :java 数列排序问题
问题描述 给定一个长度为n的数列,将这个数列按从小到大的顺序排列.1<=n<=200 输入格式 第一行为一个整数n. 第二行包含n个整数,为待排序的数,每个整数的绝对值小于10000. 输 ...
- 嵌入式LINUX启动时间优化
1. 实践过程 我是对海思3559进行启动时间优化的.具体的操作可以参考<Hi3559V100/Hi3556V100 快速启动优化指南>.软件上启动时间的优化一般是从三方面进行的:ubbo ...
- MySQL/MariaDB数据库的事务和隔离级别
MySQL/MariaDB数据库的事务和隔离级别 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.事务概述 1>.事务Transactions 一组原子性的SQL语句 ...
- springboot全局异常处理(1)
新建一个类 在类上加一个注解即可 @ControllerAdvice /** * 全局错误处理 * @author sys * */ @ControllerAdvice @ResponseBody p ...
- 树莓派安装C#运行环境
一. 安装mono ARMv6(一代 Raspberry Pi B+) : http://yunpan.cn/cw6NYzXkD9kHq 访问密码 63ae ARMv7(二代 Raspberry Pi ...
- Redis.Memcache和MongoDB区别?
Memcached的优势: Memcached可以利用多核优势,单吞吐量极高,可以达到几十万QPS(取决于Key.value的字节大小以及服务器硬件性能,日常环境中QPS高峰大约在4-6w左右.)适用 ...
- zabbix4.2.5默认告警模板
产生告警: Problem: {EVENT.NAME} Problem started at {EVENT.TIME} on {EVENT.DATE} Problem name: {EVENT.NAM ...