PostgreSQL是否为未指定主键的表创建内部键(可能是int类型)作为主键?

时间:2018-07-08 19:07:14

标签: postgresql

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

  

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

您能举一些“ OR”情况的例子吗?在这种情况下,RDBMS(特别是PostgreSQL,甚至还有MySQL或SQL Server)为表创建“内部键(可能是int类型)作为主键”而没有指定主键?

PostgreSQL有和MySQL类似的东西吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

  • 对于Postgres:

    来自"5.4. System Columns"

      

    oid

         

    一行的对象标识符(对象ID)。仅当使用WITH OIDS创建表时或在此时设置default_with_oids配置变量时,此列才存在。此列的类型为oid(与列名称相同);有关该类型的更多信息,请参见Section 8.18

      

    ctid

         

    表中行版本的物理位置。请注意,尽管可以使用ctid来快速查找行版本,但是如果ctid更新或移动了行,则VACUUM FULL将会更改。因此,`ctid不能用作长期行标识符。应该使用OID或更好的用户定义序列号来标识逻辑行。

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

  • 对于SQL Server:

    有未记录的伪列%%physloc%%。它描述了行的物理位置。但是,如果出于任何原因物理地移动了行,则可能会发生变化。而且它是未记录的,也就是说,它的行为可能在发行之间甚至补丁之间随时改变,或者可能被完全删除而无需另行通知。因此,在此处使用用户定义的PK也是更好的选择。