我正在看一些PostgreSQL表的创建,我偶然发现了以下内容:
CREATE TABLE (
...
) WITH ( OIDS = FALSE );我阅读了postgres提供的文档,我从OOP中了解了对象标识符的概念,但我仍然没有理解,
发布于 2011-04-11 20:22:04
OID基本上为每一行提供一个内置id,包含在系统列中(相对于用户空间列)。对于没有主键、没有重复行等的表来说,这很方便。例如,如果您有一个具有两个相同行的表,并且您想要删除这两个中最老的一个,您可以使用oid列来实现这一点。
OID使用4字节无符号整数实现.他们是,而不是,唯一的-OID计数器将在2平方千米-1.OID还用于标识数据类型(请参阅/usr/include/postgresql/server/catalog/pg_type_d.h)。
在我的经验中,这个特性在大多数postgres支持的应用程序(可能部分原因是它们不标准)和它们的使用基本上是不可取的。中通常是不使用的。
在PostgreSQL 8.1中,默认情况下关闭default_with_oids;在PostgreSQL的早期版本中,默认情况下是打开的。 在用户表中使用OID被认为是不可取的,因此大多数安装都应该禁用此变量。对于特定表需要OIDs的应用程序在创建表时应使用OIDS指定。为了与不遵循此行为的旧应用程序兼容,可以启用此变量。
发布于 2019-07-13 19:40:50
OID正在逐步淘汰
负责Postgres的核心团队正在逐步淘汰OID。
Postgres 12移除OID列的特殊行为
将OID用作表中的可选系统列,现在已从Postgres 12中删除。您不能再使用:
CREATE TABLE … WITH OIDS命令default_with_oids (boolean)兼容性设置数据类型OID保留在Postgres 12中,您可以显式创建OID类型的列。
在迁移到Postgres 12之后,任何可选定义的系统列 oid在默认情况下都不再是不可见的。执行SELECT *现在将包括本专栏。请注意,这个额外的“意外”列可能会打破天真编写的SQL代码。
发布于 2015-01-29 21:09:38
OID仍然用于Postgres、使用、大型对象 (尽管有些人认为大对象通常并不有用)。它们也被系统表广泛使用。例如,存储大于8KB的BYTEA(等等)的吐司使用它们。关闭到单独的存储区域(透明地),默认情况下,所有表都使用该存储区域。它们与“普通”用户表直接相关的使用基本上是已弃用。
oid类型当前被实现为一个无符号的四字节整数.因此,它不足以在大型数据库中,甚至在大型单个表中提供数据库范围的唯一性。因此,不鼓励使用用户创建的表的OID列作为主键.OID最好仅用于系统表的引用。
显然,如果OID序列超过4B 6,它就会“执行”包装。所以从本质上说,它是一个可以包装的全球计数器。如果它真的包装好了,当它被使用并“搜索”到唯一的值时,可能会出现一些减速,等等。
另见OID.3F
https://stackoverflow.com/questions/5625585
复制相似问题