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是一对(块号,块内的元组索引),用于标识其表中行的物理位置。

最新文章

  1. JS将指定的时间戳转为UTC时间
  2. NOIp 0924 水题记
  3. NOIP2016初赛总结(提高组)
  4. C#设计模式——工厂方法
  5. WEB-INF目录下的jsp页面如何访问?
  6. JAVA查找--[二分查找]
  7. Smarty控制foreach输出数量
  8. Tomcat安装与配置图文教程
  9. C语言库函数大全及应用实例一
  10. CodeForces 652B z-sort
  11. Keepalived实战(3)
  12. ASP.NET MVC编程——模型
  13. Css中的盒子结构padding和margin的区别
  14. php hook编程机制
  15. 项目实战02:LNMP的搭建、nginx的ssl加密、身份验证的实现
  16. 【bzoj1568】 JSOI2008—Blue Mary开公司
  17. mysql之mysqldump——备份与还原
  18. Linux 在文档中查找满足条件的行并输出到文件:
  19. FactoryMethod工厂方法模式(创建型模式)
  20. [转] Compile、Make和Build的区别

热门文章

  1. Mac FFmpeg编译和解决nasm/yasm not found or too old错误
  2. day 09作业 预科
  3. 大数据集群环境搭建之一 Centos基本环境准备
  4. springboot2.1.3使用mvn site遇到的坑及解决方案
  5. web之表单form
  6. WSL quick overview
  7. Linux正则表达式、shell基础、文件查找及打包压缩
  8. python的推导式 —— 列表推导式、集合和字典推导式
  9. node基础学习——http基础知识-02-http响应数据流
  10. 【MySQL】FIND_IN_SET、LIKE、IN的区别