我知道 MySQL 和 PostgreSQL[1]没有这个概念,所以我有兴趣找出一个开源 SQL 数据库确实有这个概念。
[1] 后来有人指出PostgreSQL确实有rowid伪列。
PostgreSQL
确实有这个概念。
请参阅此处以获取您感兴趣的伪列的简要列表PostgreSQL
:ctid
ctid (tuple identifier)
描述元组在数据库中的物理位置的标识符。一对数字由 ctid 表示:块号和该块内的元组索引。
那是Oracle
's 的直接模拟rowid
。
至于MySQL
,行的物理位置不可用于前端。
in MyISAM
,rowid
只是从开头开始的文件偏移量,这就是存储在索引叶子中的内容。
在InnoDB
中,表是index organized
设计使然,这意味着它们始终具有某种主键,并且InnoDB
表上的索引将其PRIMARY KEY
用作行指针。
Oracle
对于的表也是如此index organized
,其中 arowid
不是指向数据文件中块的物理指针,而是一个这样的称为logical ROWID
,或UROWID
如果您ROWID
从 中的INDEX ORGANIZED
表格中选择 a Oracle
,您将看到它具有不同的格式(类似于*BAEBwPICwQL+
)。这实际上是一个编码PRIMARY KEY
值。
请注意,如果您没有将任何列定义为PRIMARY KEY
,MySQL
将创建一个隐藏的代理项PRIMARY KEY
,您将永远无法控制它。
PRIMARY KEY
这就是为什么您应该始终在表中创建某种类型的 a InnoDB
:它是免费的,并且您可以控制该列。
如果他们都没有这样做,那么其他人也不会这样做。
SQLite 有一个自动递增的“ROWID”列,您可以使用 ROWID、_ROWID 或 OID 访问该列。如果您定义一个整数主键,那么它们将被别名。