【问题标题】:Does PostgreSQL create an internal key (probably an int type) as primary key for a table without a primary key specified?PostgreSQL 是否会为未指定主键的表创建一个内部键(可能是 int 类型)作为主键?
【发布时间】:2018-12-16 12:39:08
【问题描述】:

来自https://stackoverflow.com/a/40597571/3284469

如果您不指定主键,RDBMS 将帮助您选择唯一且非空的键,或者创建一个内部键(可能是 int 类型)作为该表的主键 .

您能否举一些“OR”情况的示例,其中 RDBMS(特别是 PostgreSQL,可能还有 MySQL 或 SQL Server)为没有的表创建“内部键(可能是 int 类型)作为主键”指定了主键?

PostgreSQL 有类似MySQL 的东西吗?

谢谢。

【问题讨论】:

  • 不,Postgres 不会创建这样的密钥

标签: postgresql


【解决方案1】:
  • 对于 Postgres:

    来自"5.4. System Columns"

    oid

    行的对象标识符(对象 ID)。仅当表是使用 WITH OIDS 创建的,或者当时设置了 default_with_oids 配置变量时,才会出现此列。此列的类型为oid(与列同名);有关该类型的更多信息,请参阅Section 8.18

    ctid

    行版本在其表中的物理位置。请注意,虽然ctid 可用于非常快速地定位行版本,但如果行的ctidVACUUM FULL 更新或移动,它将会改变。因此,`ctid 作为长期行标识符是没有用的。应该使用 OID,甚至更好的是用户定义的序列号来识别逻辑行。

    两者都接近您要搜索的内容,但有一些限制,您可以在文档中阅读。因此,正如手册所述,使用用户定义的 PK 是更好的选择。

  • 对于 SQL Server:

    有一个未记录的伪列%%physloc%%。它描述了一行的物理位置。但是,如果该行由于某种原因被物理移动,这可能会发生变化。而且它是无证的,也就是说,它的行为可能会在发布之间的任何时间改变,甚至只是补丁,或者它可能会在没有进一步通知的情况下被完全删除。所以在这里使用用户自定义的PK也是更好的选择。

【讨论】:

  • ctid 不是“主键”的替代品。它可以并且将在一行的生命周期内发生变化。
猜你喜欢
  • 1970-01-01
  • 2021-05-20
  • 1970-01-01
  • 1970-01-01
  • 2011-04-15
  • 1970-01-01
  • 2016-03-23
  • 2012-06-29
  • 2018-12-31
相关资源
最近更新 更多