2012-10-01 38 views
14

在Postgres中没有主表的主键有什么缺点吗?由于所有数据都是无序存储在堆中的,因此主键只是同时强制执行唯一键和索引的一种方式?还是有一个基本功能,主键提供在一个表中,而不是一个没有主键的表?Postgres没有主键缺点

+1

如何处理更新表中没有主键的记录? – Olaf

+0

不需要检索单个行,从不更新行,只插入。尽管这些行具有单独的身份(UUID),但它们只能在范围内抓取。我在范围上有索引,但如果可以避免的话,在唯一键上有一个索引没有意义。 – AlexGad

+1

我在问具体问题,因为我来自SQL Server后台并决定是在表上还是在堆表上使用聚簇索引,这是做出重要决定。对Postgres来说,这个决定似乎没有意义,因为数据总是无序地存储在表中以开始。但是,我想确保在这个假设中我是正确的。在Postgres vs中PK有什么好处,说一个独特的约束和一个单独的索引?有没有区别,或只是提供这些功能的简便方法? – AlexGad

回答

15

每Postgres的文档(http://www.postgresql.org/docs/9.2/static/sql-createtable.html):

从技术上讲,PRIMARY KEY只是UNIQUE和NOT的组合NULL,但将一组列作为主键标识还提供关于模式设计的元数据,因为主键意味着其他表可以依赖这组列作为行的唯一标识符 。

从经验来看,我创造了许多没有它们的表格。没有主键的最大缺点之一是你不能通过外键进行参照完整性检查 - 因为这种关系需要一个。我认为一些复制解决方案还需要有一个主键,或者每行的单列标识符。

+0

啊,关于复制问题的好处。这完全滑了我的脑海。虽然我在每一行中都有一个唯一的UUID,但我应该确保没有PK不会成为复制问题(没有外键,因此这不是问题)。谢谢。 – AlexGad

+1

另一个令人难以置信的问题是大多数ORM(例如Django)在处理没有主键的表时遇到问题。所以,如果需要在桌面上放置一个UI,那么对于任何正在工作的人来说,它可能会让生活变得更加困难。这不是什么大问题,但可能是一个考虑因素(取决于公司/团队内的数据和发生的情况)。 –

+8

外键约束要求在目标列上有一个'UNIQUE'索引。不一定是主键。 –