【PostgreSQL】从零开始:(三十四)数据类型-对象标识符类型

发布时间:2023年12月28日

对象标识符(Object Identifier)

对象标识符(Object Identifier)类型通常指的是在编程中用于唯一标识对象的数据类型。不同编程语言和框架中,对象标识符类型有不同的实现方式和命名。

在Java中,对象标识符类型一般是通过引用(Reference)来实现的,即使用对象引用来唯一标识对象。在C#中也类似,使用引用类型(Reference Type)来进行对象标识。

在Python中,对象标识符类型是通过对象的内存地址来唯一标识的。可以使用内置函数id()来获取对象的内存地址。

在数据库中,对象标识符类型通常是通过主键(Primary Key)来唯一标识数据库表中的记录。

总结来说,对象标识符类型是用来唯一标识对象的数据类型,具体的实现方式和命名取决于编程语言和框架的设计。

PostgreSQL 的对象标识符

PostgreSQL 在内部使用对象标识符 (OID) 作为各种系统表的主键。Type 表示对象标识符。还有几种别名类型,每种类型都命名为 。

oid类型目前实现为无符号的四字节整数。因此,它不够大,无法在大型数据库中甚至在大型单个表中提供数据库范围的唯一性。

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

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

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

而不是:

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

虽然这本身看起来并不那么糟糕,但它仍然过于简单化。如果在不同的架构中命名了多个表,则需要更复杂的子选择来选择正确的 OID。regclass输入转换器根据架构路径设置处理表查找,因此它会自动执行“正确操作”。同样,将表mytable的 OID 转换为数字 OID 的符号显示也很方便。

名字引用描述值示例
oid任何数字对象标识符564182
regclasspg_class关系名称pg_type
regcollationpg_collation排序规则名称“POSIX”
regconfigpg_ts_config文本搜索配置english
regdictionarypg_ts_dict文本搜索词典simple
regnamespacepg_namespace命名空间名称pg_catalog
regoperpg_operator运算符名称+
regoperatorpg_operator具有参数类型的运算符*(integer,?integer)或-(NONE,?integer)
regprocpg_proc函数名称sum
regprocedurepg_proc具有参数类型的函数sum(int4)
regrolepg_authid角色名称smithee
regtypepg_type数据类型名称integer

按命名空间分组的对象的所有 OID 别名类型都接受架构限定名称,如果未经限定在当前搜索路径中找不到该对象,则将在输出中显示架构限定名称。例如myschema.mytable::regclass,是可接受的输入(如果有这样的表)。该值可能输出为myschema.mytablemytable::regproc ,也可能仅输出为regoper,regproc edure ,具体取决于当前搜索路径。和别名类型将只接受唯一(不重载)的输入名称,因此它们的用途有限;对于大多数用途或更合适。对于NONE ,一元运算符通过写入未使用的操作数来标识。

这些类型的输入函数允许标记之间有空格,并将大写字母折叠为小写,但双引号内除外;这样做是为了使语法规则类似于在 SQL 中编写对象名称的方式。相反,如果需要,输出函数将使用双引号,使输出成为有效的 SQL 标识符。例如FooF’ “Foo” ( int, integer ) '::regprocedure"Foo"(integer,integer),一个名为(大写)的函数的 OID 可以输入为两个整数参数。输出将如下所示。函数名称和参数类型名称也可以是架构限定的。

许多内置的 PostgreSQL 函数接受表的 OID 或其他类型的数据库对象,并且为了方便起见,它们被声明为 take(或适当的 OID 别名类型)。这意味着您不必手动查找对象的 OID,而只需将其名称输入为字符串文字即可。例如,该函数采用序列关系的 OID,因此您可以像这样调用它:regclassnextval(regclass)

nextval('foo')              operates on sequence foo
nextval('FOO')              same as above
nextval('"Foo"')            operates on sequence Foo
nextval('myschema.foo')     operates on myschema.foo
nextval('"myschema".foo')   same as above
nextval('foo')              searches search path for foo
文章来源:https://blog.csdn.net/sinat_36528886/article/details/135220277
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。