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 tableswith no columns leading to syntax error. This patch avoids addingparenthesis for such tables.Reported-by: Justin GAuthor: Vignesh CReviewed-by: Peter Smith, Amit KapilaBackpatch-through: 15Discussion: 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 TABLEpostgres=# 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)_785a_(0,2)_786a_(0,3)_787a_(0,4)_788
(4 rows)

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/208788.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计网Lesson3 - 计算机网络评价指标与封包解包

文章目录 计算机网络的性能指标1. 速率2. 带宽3. 吞吐量4. 时延5. 时延带宽积6. 往返时间7. 利用率8. 数据的解包和封包 计算机网络的术语实体![实体](https://img-blog.csdnimg.cn/direct/cbf4ca9ed5ab4df290b5a17b4642c6a1.png)协议服务 计算机网络的性能指标 1. 速率 数据…

c语言-结构体

文章目录 1. 结构体类型的声明2 . 结构体变量的创建和初始化(1)结构体变量的创建和初始化(2)结构的特殊声明(3)结构的自引用(4)typedef和结构体 3 . 结构成员访问操作符4. 结构体传参5. 结构体内存对齐(1)对…

解决ant-design-vue中Select组件v-model值为空字符串不显示placeholder的bug

方法一: 1.找到node_modules/ant-design-vue/es/vc-select/SingleSelector.js文件 搜索renderPlacehoder方法 将其修改为 const renderPlacehoder () > {const list props.values.filter(val > val.value ! );if (list[0]) {return null}... }2.在此文件中…

Vulhub-信息泄露

1.Jetty WEB-INF 敏感信息泄露漏洞(CVE-2021-28164) docker-compose up -d 启动环境,显示8080端口被占用 修改 docker-compose.yml 中的映射端口 curl 访问 http://192.168.48.129:8090/WEB-INF/web.xml 显示404: 通过 %2e 绕过…

分享84个节日PPT,总有一款适合您

分享84个节日PPT,总有一款适合您 84个节日PPT下载链接:https://pan.baidu.com/s/1TSIGR8ZIytnTKmQRa0rGnw?pwd6666 提取码:6666 Python采集代码下载链接:采集代码.zip - 蓝奏云 学习知识费力气,收集整理更不易…

【Python百练——第3练】矩形类及操作

💐作者:insist-- 💐个人主页:insist-- 的个人主页 理想主义的花,最终会盛开在浪漫主义的土壤里,我们的热情永远不会熄灭,在现实平凡中,我们终将上岸,阳光万里 ❤️欢迎点…

[蓝桥杯 2019 省 B] 特别数的和-C语言的解法

小明对数位中含有 2、0、1、9 的数字很感兴趣(不包括前导 0),在 1 到 40 中这样的数包括 1、2、9、10 至 32、39 和 40,共 28 个,他们的和是 574。 请问,在 1 到 n 中,所有这样的数的和是多少&…

【ArcGIS Pro微课1000例】0044:深度学习--面部模糊(马赛克)

本文讲解ArcGIS Pro中通过深度学习工具实现人脸面部模糊,起到马赛克的作用。 文章目录 一、效果对比二、工具介绍三、案例实现一、效果对比 原始图片: 深度学习后的模糊照片: 二、工具介绍 本工具为ArcGIS Pro工具箱中的深度学习工具中的:使用深度学习分类像素,如下所示…

基于单片机智能液位水位监测控制系统

**单片机设计介绍, 基于单片机智能液位水位监测控制系统 文章目录 一 概要特点应用场景工作原理实现方式 系统功能实时监测控制调节报警功能数据记录与分析 总结 二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 ## 系统介绍 基于单片机…

编码相关的软技能,我看了这些书

大家好,我是老三,作为一个开发工程师,写代码是我们安身立命的根本,但是代码相关,代码之外,一些软技能也很重要,写代码很多时候决定能不能干活,软技能决定能不能干好活。 老三的编码…

04. 函数

目录 1、前言 2、Python中的函数 2.1、内置函数 2.2、自定义函数 2.3、函数调用 3、函数的参数 3.1、形参和实参 3.2、位置参数(Positional Arguments) 3.3、默认参数(Default Arguments): 3.4、关键字参数&a…

Spring Boot实现热部署

Spring Boot提供了一个名为spring-boot-devtools的开发工具,它可以实现热部署功能。通过使用spring-boot-devtools,可以在修改了resources目录下的内容后,自动重新加载应用程序,而无需手动重启。 以下是使用spring-boot-devtools…

增强现实技术革新零售业:提升购物体验的未来技术

增强现实(AR)技术正在改变零售业的面貌,为消费者提供了全新的购物体验。本文将探讨AR技术在零售行业中的应用,以及它如何改变传统的购物方式。 首先,AR技术允许消费者在现实世界中查看虚拟的产品展示。在服装和家具行业…

Zookeeper 安装与部署

Zookeeper官网 目录 1 配置文件参数解读2 Zookeeper 单点安装3 Zookeeper 分布式安装 1 配置文件参数解读 Zookeeper 中的配置文件 zoo.cfg 中参数含义解读如下: (1)tickTime 2000:通信心跳数,Zookeeper 服务器与客户…

DS二分查找_搜索二维矩阵

Description 使用二分查找法来判断m*n矩阵matrix中是否存在目标值target。 该矩阵有以下特性: 1. 每行中的整数从左到右升序排列; 2. 每行的第一个整数大于前一行的最后一个整数。 Input 第一行输入m和n,分别表示矩阵的行数和列数&#…

面试官:说说Vue中Proxy与Object.defineProperty的用法与区别

前言 面试时,我们说完Vue响应式原理,或者Vue2和Vue3的区别时,通常会引出Vue3使用了Proxy来优化响应式,而面试官会继续深挖:说说Proxy与Object.defineProperty的区别。 我们不能只说Proxy直接代理一个对象&#xff0c…

Feign代替RestTemplate发起http请求

RestTemplate代码: // public Order queryOrderById(Long orderId) {// // 1.查询订单// Order order orderMapper.findById(orderId);// //String url "http://localhost:8081/user/" order.getUserId();// String url "htt…

python初始化矩阵相关

做算法题经常需要初始化一个二维的dp数组 下面两种方法是最常用的 matrix [[0]*n]*n matrix [[0]*n for _ in range(n)]以前经常混用也没发现什么问题,直到昨天debug的时候发现第一种初始化之后对矩阵进行赋值时混乱的,比如matrix[0][1]2会导致所有行…

python+Appium自动化:python多线程多并发启动appium服务

Python启动Appium 服务 使用Dos命令或者bat批处理来手动启动appium服务,启动效率低下。如何将启动Appium服务也实现自动化呢? 这里需要使用subprocess模块,该模块可以创建新的进程,并且连接到进程的输入、输出、错误等管道信息&…

宝塔+docker+jenkins部署vue项目----笔记版

宝塔dockerjenkins部署vue项目(保姆级教程)https://blog.csdn.net/weixin_47284756/article/details/129339940 基于上述教程,不同的地方。 1.我使用的是gitee,所以需要在jenkins中安装gitee插件 配置gitee,其他默认配…