为什么在PostgreSQL中要创建一个空的(没有行,没有列)表?

15

回答这个问题后,我了解到您可以在PostgreSQL中创建空表。

create table t();

这有什么实际用途吗?为什么会创建一个空表?因为你不知道它将有哪些列吗?

4个回答

8
以下是我认为无列表格的好处,它们可能更多地属于温暖和模糊类别:
1. 在添加任何用户定义列之前创建表格的一个实际用途是,在创建新系统或进行快速开发迭代时,它可以让您快速迭代。
2. 更像是第一种用途,但是它可以让您存根表格,以便您的应用程序逻辑或过程可以引用它们,即使尚未放置列。
3. 我可以看到在大公司有很多开发人员的情况下,它会变得方便。也许您想在完成工作之前提前几个月保留名称。只需将新的无列表格添加到构建中。当然,他们仍然可以劫持它,但是您可能能够赢得争论,即在他们提出其他计划之前,您已经使用它了。有点边缘,但是是一个有效的好处。
所有这些都很方便,当我不在PostgreSQL中工作时,我会想念它们。

也许你想在工作完成之前数月预留一个名称。我会使用元语法列名称,或者可能是get_your_dirty_paws_off_my_table。 - RonJohn

5
我不知道为什么PostgreSQL要包含零列表,但是零属性关系在关系代数理论中扮演了一个角色,而SQL就是基于这个理论的(广泛地说)。
具体来说,没有元组的零属性关系(在SQL术语中,即没有列和行的表)是零或假的关系等价于关系代数中的零;而没有属性但有一个元组的关系(SQL:没有列,但有一行,在PostgreSQL中好像不可能)则是真或一。Hugh Darwen是关系理论的坚定支持者和SQL批评家,他分别称这些为“Table Dum”和“Table Dee”。
在普通的代数中,x + 0 == xx * 0 == 0,而x * 1 == x;关系代数中的想法是,Table Dum 和 Table Dee 可以用作类似于联接、并集等的原语。
PostgreSQL 内部将表(以及视图和序列)称为“关系”,因此虽然它是围绕实现 SQL 的,而 SQL 并没有被这种纯关系代数所定义,但在其设计或历史中可能存在这样的元素。

5

我不认为我的用法是预期的,但最近我使用了一个空表作为锁定动态创建和更改的视图。创建/替换视图的函数对空表具有ACCESS EXCLUSIVE权限,使用视图的其他函数具有ACCESS权限。


4
这不是空表,只是没有结果。PostgreSQL的行包含一些默认情况下看不见的列。我不确定,但它可能是来自Postgres作为面向对象关系数据库时的历史遗留问题,并且PG支持POSTQUEL语言。这个空表可以作为类层次结构中的抽象祖先。 系统列列表

黑暗时代是因为POSTQUEL还是因为对象关系部分?Postgres仍然是一种对象关系数据库,许多人认为这是一件好事。 - Adam Gent
@Adam 如果你在考虑面向对象的概念,那么Postgresql不是面向对象关系型数据库。 - Clodoaldo Neto
@AdamGent,“黑暗时代”对我来说并不是负面的。Stonebraker的许多概念确实非常出色,尽管我不是QUEL的粉丝,也不是当前PostgreSQL中某些陌生概念(如可继承性)的粉丝。 - Pavel Stehule
@ClodoaldoNeto 我确实说了“对象关系”。是的,我知道它们之间的区别。此外,我不使用继承性,但我知道其他人会用于分片。 - Adam Gent
不,从我们通常说一个表有一些列的意义上来说,这样的表没有列。没有列的表是关系模型的自然组成部分,但 SQL 在各种方面都是非关系型的。每个查询子表达式的值都包含行,这些行的列值使某个语句模板成为真实陈述。在没有列的情况下,它保存使某个真假陈述成立的行,即仅当相关联的语句为真时,它才保存行 ()。 - philipxy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接