PostgreSQL有意思的现象:支持不带列的表

news/2024/7/9 20:55:19 标签: postgresql, 数据库

1、前言

以前从没有试过建一张表,不带任何列。在PG中却支持这种语法。这是个什么鬼?

最近,把PG源码扒了下,简单浏览了下最近的一些merge。其中有一个fix:

eeb0ebad79 ("Fix the initial sync tables with no columns.", 2023-11-22)

    Fix the initial sync tables with no columns.

    The copy command formed for initial sync was using parenthesis for tables
    with no columns leading to syntax error. This patch avoids adding
    parenthesis for such tables.

    Reported-by: Justin G
    Author: Vignesh C
    Reviewed-by: Peter Smith, Amit Kapila
    Backpatch-through: 15
    Discussion: http://postgr.es/m/18203-df37fe354b626670@postgresql.org

简单的说,是它考虑到一张表,在初始SYNC时,有可能没有任何列。按自己的印象,别的DBMS好像没有支持这种语法的。

2、简单验证

如果我们在SQLSERVER哪怕是最新版2022上试一下,

https://dbfiddle.uk/1n2I7Bj9
create table tab_no_col();
-- 立马报错
Msg 102 Level 15 State 1 Line 1
Incorrect syntax near ')'.

图片

切到MySQL, 也不支持这种语法:

https://dbfiddle.uk/xZPbFq4N
create table tab_no_col();
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1

图片

再试下Oracle, 发现也不支持。哪怕是23C。

https://dbfiddle.uk/-F2lutlX
create table tab_no_col();
ORA-00931: missing identifier

图片

3、PostgreSQL中的行为

我们就以PostgreSQL 14为例 :

postgres=# create table tab_no_col();
CREATE TABLE
postgres=# insert into tab_no_col default values;
INSERT 0 1
postgres=# select * from tab_no_col;
--
(1 row)

postgres=# insert into tab_no_col default values;
INSERT 0 1
postgres=# insert into tab_no_col default values;
INSERT 0 1
postgres=# insert into tab_no_col default values;
INSERT 0 1
postgres=# select count(*) from tab_no_col;
 count 
-------
     4
(1 row)

postgres=# select * from tab_no_col;
--
(4 rows)

虽然没有真正的值,但是却一样可以插入相关的值,并得到相应的行数。

根据这种特性,我们甚至可以预先建一张没有任何列的表,然后,插入一些列。看看:

postgres=# alter table tab_no_col add col2 varchar(32) null;
ALTER TABLE

postgres=# select * from tab_no_col;
 col2 
------




(4 rows)

更新一些值:

postgres=# update tab_no_col set col2 = 'a_' || ctid || '_' || xmin;
UPDATE 4
postgres=# select * from tab_no_col;
    col2     
-------------
 a_(0,1)_785
 a_(0,2)_786
 a_(0,3)_787
 a_(0,4)_788
(4 rows)

这种功能,也许最大的好处就是先建一张表(空列),然后可以动态的增加或改变一些列。利用FOR循环时,直接"(" 和 ”)" 做匹配,而不用考虑列数是否真正大于0。

反正CREATE TABLE ABC(, 即算完全是空的,语法上它也不会报错。


http://www.niftyadmin.cn/n/5247796.html

相关文章

机器学习应用 | 使用 MATLAB 进行异常检测(上)

异常检测任务,指的是检测偏离期望行为的事件或模式,可以是简单地检测数值型数据中,是否存在远超出正常取值范围的离群值,也可以是借助相对复杂的机器学习算法识别数据中隐藏的异常模式。 在不同行业中,异常检测的典型…

化工园区全域高精度定位监管解决方案:引领化工行业发展的未来

化工园区全域高精度定位监管解决方案:引领化工行业发展的未来 随着全球化工行业的日益发展壮大,化工园区成为了全球经济发展的核心引擎。然而,伴随着园区规模的不断扩张,监管工作的难度也逐渐增加。为了应对化工园区监管的新挑战&…

【蓝桥杯省赛真题50】Scratch消除字母 蓝桥杯scratch图形化编程 中小学生蓝桥杯省赛真题讲解

目录 scratch消除字母 一、题目要求 编程实现 二、案例分析 1、角色分析

畅游Java流:深入探索Stream流

为何选择Stream流? 以直观的代码展示逻辑,简洁明了Stream流引入真正的函数式编程风格到Java中代码更为简洁,不受无关逻辑方式的约束 Stream流的三类方法 1. 获取Stream流 创建流水线,准备对数据进行操作 2. 中间方法 操作流…

【五分钟】熟悉python列表和元组的异同点【看这篇够用!建议收藏】

引言 Python,是一种广泛应用于数据科学、机器学习等领域的高级编程语言,支持多种丰富多样的数据类型,其中包括列表和元组。尽管这两种数据结构都可用于存储多个值,但它们在功能和特性上存在着明显的差异。在接下来的博客中&#…

东北地理所最新Nature通讯文章

作为城市的重要组织部分,城市湿地在水源供给、增湿降温、雨洪调蓄等多个方面发挥着极其重要的作用,2024年国际湿地日主题定为“湿地与人类福祉”。在此背景下,中国科学院东北地理与农业生态研究所毛德华研究员等在12月5日出版的Nature发表题为…

融合科技,升级医疗体验——医院陪诊服务的技术创新

随着科技的迅猛发展,医疗服务领域也在积极借助技术手段提升患者体验。本文将探讨如何利用先进的技术代码,将医院陪诊服务推向新的高度。 1. 医疗预约系统的实现 # 通过Python代码实现医疗预约系统 class MedicalAppointment:def __init__(self, patie…

机器学习--稀疏学习

前置知识: 通常学习一次模型的过程如下:我们普遍为了获取更好的模型效果,直接对原始数据学习,会造成过拟合、需要特征提取; 而若特征提取完后依旧有很多特征,还是会容易过拟合。这时候就需要特征降维和特…