【PostgreSQL】从零开始:(三十四)数据类型-对象标识符类型
对象标识符(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 |
regclass | pg_class | 关系名称 | pg_type |
regcollation | pg_collation | 排序规则名称 | “POSIX” |
regconfig | pg_ts_config | 文本搜索配置 | english |
regdictionary | pg_ts_dict | 文本搜索词典 | simple |
regnamespace | pg_namespace | 命名空间名称 | pg_catalog |
regoper | pg_operator | 运算符名称 | + |
regoperator | pg_operator | 具有参数类型的运算符 | *(integer,?integer)或-(NONE,?integer) |
regproc | pg_proc | 函数名称 | sum |
regprocedure | pg_proc | 具有参数类型的函数 | sum(int4) |
regrole | pg_authid | 角色名称 | smithee |
regtype | pg_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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!