在回答这个问题时,我了解到您可以在 PostgreSQL 中创建空表。
create table t();
这有什么真正的用例吗?为什么要创建空表?因为你不知道它会有哪些列?
从我的角度来看,这些都是少列表的优点。它们可能更多地属于温暖和模糊的类别。
1. 在添加任何用户定义的列之前创建表的一个实际用途是,它允许您在创建新系统时快速迭代,或者通常只是进行快速的开发迭代。
2. 多于 1,但可以让您删除应用程序逻辑或过程也可以引用的表,即使列尚未到位。
3. 如果您在一家拥有大量开发人员的大公司工作,我可以看到它的出现。也许你想在你的工作完成之前提前几个月预订一个名字。只需将新的无列表添加到构建中。当然,他们仍然可以使用它,但您可能会在他们提出其他计划之前赢得您已经使用它的论点。一种边缘,但一个有效的好处。
所有这些都很方便,当我不在 PostgreSQL 中工作时我会想念它们。
我不知道将其包含在 PostgreSQL 中的确切原因,但零列表 - 或者更确切地说是零属性关系 - 在关系代数理论中发挥作用,SQL(广泛)基于该理论。
具体来说,没有元组的零属性关系(在 SQL 术语中,一个没有列和行的表)是零或假的关系等价物,而没有属性但只有一个元组的关系(SQL:没有列,但有一个行,据我所知,这在 PostgreSQL 中是不可能的)为真或一。关系理论的直言不讳的倡导者和 SQL 的批评者 Hugh Darwen 分别称它们为“Table Dum”和“Table Dee”。
在正规代数中x + 0 == x
和x * 0 == 0
, 而x * 1 == x
; 这个想法是,在关系代数中,Table Dum 和 Table Dee 可以用作连接、联合等的相似原语。
PostgreSQL 在内部将表(以及视图和序列)称为“关系”,因此尽管它旨在实现 SQL,而这种 SQL 不是由这种纯关系代数定义的,但在其设计或历史。
我不认为我的预期用途是,但最近我使用一个空表作为视图的锁,我使用 EXECUTE 创建和更改动态视图。创建/替换视图的函数在空表上具有 ACCESS EXCLUSIVE,而使用视图的其他函数具有 ACCESS。
它不是空表 - 只有空结果。PostgreSQL 行包含一些不可见的(默认情况下)列。我不确定,但它可能是黑暗时代的产物,当时 Postgres 是对象关系数据库 - 并且 PG 支持语言 POSTQUEL。这个空表可以作为类层次结构中的抽象祖先。