PostgreSQL的oid
在 PostgreSQL 中,OID(对象标识符,Object Identifier)是一种用于唯一标识数据库对象(如行、表、索引等)的内部标识符。OID 是4字节整数,由系统自动生成。虽然 OID 曾经是 PostgreSQL 中许多系统表的默认列,但在后来版本中,出于性能和管理考虑,新建的表默认不会自动包含 OID。
OID 的主要用途
- 唯一标识对象:OID 可以唯一标识表、索引、视图、序列等数据库对象。
- 系统表查询:许多系统表(如
pg_class
、pg_type
等)使用 OID 来管理数据库元数据。 - 兼容性:某些关键特性或功能需要使用 OID,比如系统管理工具和遗留系统。
查看 OID
查看表的 OID
可以使用系统表 pg_class
来查看表的 OID。例如,查看某张表的 OID:
SELECT oid, relname
FROM pg_class
WHERE relname = 'your_table_name';
查看行的 OID
如果表包含 OID 列(例如旧版本或手动添加的 OID 列),可以直接查询该列。需要注意,默认新建表不会包含 OID。
SELECT oid, * FROM your_table_name;
创建包含 OID 的表
虽然默认情况下 PostgreSQL 新建表不会自动包含 OID,但可以通过 WITH OIDS
指定表包含 OID(注意:WITH OIDS
在 PostgreSQL 12 及以后的版本中已被移除,不再支持)。
CREATE TABLE your_table_name (
id SERIAL PRIMARY KEY,
data TEXT
) WITH OIDS;
实践示例
示例1:查看 pg_class
中的表及其 OID
SELECT oid, relname, relnamespace
FROM pg_class
WHERE relkind = 'r'; -- 仅选择普通表
输出示例:
oid | relname | relnamespace
-------+-------------+--------------
16384 | my_table | 2200
16385 | another_tab | 2200
示例2:在 pg_type
中查看数据类型及其 OID
SELECT oid, typname
FROM pg_type;
输出示例:
oid | typname
-------+-----------------------
23 | int4
25 | text
1043 | varchar
...
示例3:在 pg_class
和 pg_attribute
中查询列的 OID
如果需要查看某张表中特定列的 OID,可以使用以下查询(表需包含 OID 列):
-- 假设表名为 your_table_name
SELECT c.oid AS table_oid, a.attnum, a.attname, a.attrelid
FROM pg_class c
JOIN pg_attribute a ON a.attrelid = c.oid
WHERE c.relname = 'your_table_name' AND a.attname = 'your_column_name';
系统表中的 OID 字段
PostgreSQL 包括许多系统表,每个系统表都有一个 OID 作为其唯一标识。在这些系统表中,OID 用于代表不同类型的对象。以下是一些常用系统表及其 OID 字段:
pg_class
:存储所有表、索引、视图、序列等对象的元信息。SELECT oid, relname FROM pg_class WHERE relname = 'your_table_name';
pg_type
:存储所有数据类型的元信息。SELECT oid, typname FROM pg_type;
pg_proc
:存储所有函数和存储过程的元信息。SELECT oid, proname FROM pg_proc;
pg_namespace
:存储所有命名空间(schema)的元信息。SELECT oid, nspname FROM pg_namespace;
总结
OID 在 PostgreSQL 中作为对象的唯一标识符,用于数据库管理和系统元数据查询。尽管现代 PostgreSQL 应用中多数情况下不再使用 OID 作为表的默认列,但了解其用途及如何查询和管理 OID 对数据库管理员(DBA)和开发者仍然非常重要。借助系统表 pg_class
、pg_type
、pg_proc
和 pg_namespace
,可以有效地进行数据库对象的查询和管理。