来自https://stackoverflow.com/a/40597571/3284469
如果您未指定主键,则RDBMS将帮助您选择唯一且非空的键,或者创建一个内部键(可能是int类型)作为此表的主键
您能举一些“ OR”情况的例子吗?在这种情况下,RDBMS(特别是PostgreSQL,甚至还有MySQL或SQL Server)为表创建“内部键(可能是int类型)作为主键”而没有指定主键?
PostgreSQL有和MySQL类似的东西吗?
谢谢。
答案 0 :(得分:1)
对于Postgres:
oid
一行的对象标识符(对象ID)。仅当使用
WITH OIDS
创建表时或在此时设置default_with_oids配置变量时,此列才存在。此列的类型为oid
(与列名称相同);有关该类型的更多信息,请参见Section 8.18。
和
ctid
表中行版本的物理位置。请注意,尽管可以使用
ctid
来快速查找行版本,但是如果ctid
更新或移动了行,则VACUUM FULL
将会更改。因此,`ctid不能用作长期行标识符。应该使用OID或更好的用户定义序列号来标识逻辑行。
两者都很接近您要搜索的内容,但是有一些限制,您可以在文档中阅读。因此,如手册所述,使用用户定义的PK是更好的选择。
对于SQL Server:
有未记录的伪列%%physloc%%
。它描述了行的物理位置。但是,如果出于任何原因物理地移动了行,则可能会发生变化。而且它是未记录的,也就是说,它的行为可能在发行之间甚至补丁之间随时改变,或者可能被完全删除而无需另行通知。因此,在此处使用用户定义的PK也是更好的选择。