当前位置: 首页 > news >正文

【PostgreSQL】表管理-表继承

PostgreSQL 表继承

PostgreSQL 实现了表继承,这对于数据库设计人员来说是一个有用的工具。(SQL:1999 及更高版本定义了类型继承功能,该功能在许多方面与此处描述的功能不同。

让我们从一个例子开始:假设我们正在尝试为城市构建一个数据模型。每个州都有许多城市,但只有一个首府。我们希望能够快速检索任何特定州的首都。这可以通过创建两个表来完成,一个用于州首府,另一个用于非首府城市。但是,当我们想询问有关一个城市的数据时,无论它是否是首都,会发生什么?继承功能可以帮助解决此问题。我们定义表,使cities 继承自 capitals。

root@bc7c2dba3b38:/# psql -Upostgres postgres
psql (16.1 (Debian 16.1-1.pgdg120+1))
Type "help" for help.postgres=# CREATE TABLE cities (
postgres(#     name            text,
postgres(#     population      float,
postgres(#     elevation       int     -- in feet
postgres(# );
CREATE TABLE
postgres=# CREATE TABLE capitals (
postgres(#     state           char(2)
postgres(# ) INHERITS (cities);
CREATE TABLE
postgres=# 

查询capitals表结构如下:

postgres=# \d capitals;Table "public.capitals"Column   |       Type       | Collation | Nullable | Default 
------------+------------------+-----------+----------+---------name       | text             |           |          | population | double precision |           |          | elevation  | integer          |           |          | state      | character(2)     |           |          | 
Inherits: citiespostgres=# 

在这种情况下,capitals表继承它的父表cities 中的所有属性。州首府有一个额外的state属性显示其所在的州。

在PostgreSQL里,一个表可以从零个或多个其它表中继承属性,而且一个查询既可以引用一个表中的所有行,也可以引用一个表及其所有后代表的行(后面这个是缺省行为)。比如,下面的查询查找所有海拔 500 英尺以上的城市名,包括州首府:

SELECT name, altitudeFROM citiesWHERE altitude > 500;

使用PostgreSQL教程里面的数据,它返回:

   name    | altitude
-----------+----------Las Vegas |     2174Mariposa  |     1953Madison   |      845

另一方面,如果要找出不包括州首府的所有海拔超过 500 英尺的城市,查询应该是这样的:

SELECT name, altitudeFROM ONLY citiesWHERE altitude > 500;name    | altitude
-----------+----------Las Vegas |     2174Mariposa  |     1953

cities前面的ONLY表明该查询应该只针对cities 而不包括其后代。许多我们已经讨论过的命令(SELECT, UPDATE 和 DELETE)都支持ONLY关键字。

你也可以在表名后面写一个*显示指定包括所有后代表:

SELECT name, altitudeFROM cities*WHERE altitude > 500;

因为这个行为是默认的,所以写并不是必须的(除非你已经改变了 sql_inheritance里面的配置选项)。然而,写 可以用于强调搜索额外的表。

有时候你可能想知道某个行版本来自哪个表。在每个表里我们都有一个tableoid 系统属性可以告诉你源表是谁:

SELECT c.tableoid, c.name, c.altitude
FROM cities c
WHERE c.altitude > 500;

结果如下(你可能会得到不同的 OID):

 tableoid |   name    | altitude
----------+-----------+----------139793 | Las Vegas |     2174139793 | Mariposa  |     1953139798 | Madison   |      845

通过和pg_class做一个连接,就可以看到实际的表名字:

SELECT p.relname, c.name, c.altitude
FROM cities c, pg_class p
WHERE c.altitude > 500 AND c.tableoid = p.oid;

它返回:

 relname  |   name    | altitude
----------+-----------+----------cities   | Las Vegas |     2174cities   | Mariposa  |     1953capitals | Madison   |      845

对于INSERT或COPY,继承并不自动影响其后代表。在我们的例子里,下面的INSERT语句将会失败:

INSERT INTO cities (name, population, altitude, state)
VALUES ('New York', NULL, NULL, 'NY');

我们可能希望数据被传递到capitals表里面去,但这是不会发生的:INSERT总是插入明确声明的那个表。在某些情况下,我们可以使用规则进行重定向插入。不过它不能对上面的例子有什么帮助,因为cities表并不包含state 字段,因此命令在规则施加之前就会被拒绝掉。

所有父表的检查约束和非空约束都会自动被所有子表继承。不过其它类型的约束(唯一、主键、外键约束)不会被继承。

一个子表可以从多个父表继承,这种情况下它将拥有所有父表字段的总和,并且子表中定义的字段也会加入其中。如果同一个字段名出现在多个父表中,或者同时出现在父表和子表的定义里,那么这些字段就会被"融合",这样在子表里就只有一个这样的字段。要想融合,字段的数据类型必须相同,否则就会抛出一个错误。融合的字段将会拥有其父字段的所有检查约束,并且如果某个父字段存在非空约束,那么融合后的字段也必须是非空的。

表继承通常使用带INHERITS子句的CREATE TABLE语句定义。另外,一个已经用此方法定义的子表可以使用带INHERIT的ALTER TABLE 命令添加一个新父表。注意:该子表必须已经包含新父表的所有字段且类型一致,此外新父表的每个约束的名字及其表达式都必须包含在此子表中。同样,一个继承链可以使用带NO INHERIT的ALTER TABLE命令从子表上删除。允许动态添加和删除继承链对基于继承关系的表分区很有用。

创建一个将要作为子表的新表的便利途径是使用带LIKE子句的 CREATE TABLE命令。它将创建一个与源表字段相同的新表。如果源表中存在约束,那么应该指定LIKE的INCLUDING CONSTRAINTS 选项,因为子表必须包含源表中的CHECK约束。

任何存在子表的父表都不能被删除,同样,子表中任何从父表继承的字段或约束也不能被删除或修改。如果你想删除一个表及其所有后代,最简单的办法是使用CASCADE选项删除父表。

ALTER TABLE会把所有数据定义和检查约束传播到后代里面去。另外,只有在使用CASCADE选项的情况下,才能删除依赖于其他表的字段。 ALTER TABLE在重复字段融合和拒绝方面和CREATE TABLE的规则相同。

请注意表访问权限是如何处理的。访问父表会自动访问在子表中的数据,而不需要更多的访问权限检查。这保留了父表中数据的表现。然而,直接访问子表不会自动允许访问父表,要访问父表需要更进一步的权限被授予。

警告
注意,不是所有的 SQL 命令可以在所有的继承层次上正常工作。数据查询,数据修改,模式修改的命令(比如SELECT,UPDATE,DELETE, ALTER TABLE的大多数变型,但不是INSERT和 ALTER TABLE … RENAME)典型的默认包括子表和支持ONLY符号来排除它们。为数据库维护和调优的命令(例如REINDEX,VACUUM)通常只对个别工作,物理表格不支持递归超过继承层次结构。单独命令各自的行为记录在了它们的参考页中。

继承的一个严重局限性是索引(包括唯一约束)和外键约束只能用于单个表,而不能包括它们的子表(不管对外键约束的引用表还是被引用表都是如此),因此,在上面的例子里:

即使我们声明cities.name为UNIQUE或PRIMARY KEY,也不会阻止capitals表拥有重复名字的cities数据行。并且这些重复的行在查询cities表的时候会显示出来。实际上,缺省时capitals将完全没有唯一约束,因此可能包含带有同名的多个行。你应该给capitals增加唯一约束,但即使这样做也不能避免与cities的重复。

类似的,即使我们声明cities.name 参照(REFERENCES)某些其它的表,这个约束也不会自动传播到capitals表。在这种条件下,你可以通过手工给capitals表增加同样的REFERENCES约束来做到这点。

声明一个其它表的字段为REFERENCES cities(name)将允许其它表包含城市名,但是不包含首府名。这种情况下没有很好的绕开办法。

表继承的使用

表继承体现了支持对象关系存储的特点[1]

表继承的两种场景是:支持面向对象的数据建模,实现表的水平分割

创建表继承
定义父类表

CREATE TABLE vehiches (name text PRIMARY KEY,color text,weight float,area text,manufactureid int
)

创建继承表

CREATE TABLE bikes(size float NOT NULL
) INHERITS(vehicles);CREATE TABLE cars(displacement float NOT NULL
) INHERITS(vehicles);CREATE TABLE trucks(load float NOT NULL
) INHERITS(vehicles);

使用表继承

  1. 查询数据

只查询父表记录

SELECT * FROM ONLY vehicles;

如果不添加,会将父表和子表数据一起查出

  1. 变更数据

通过父表删除子表中数据

DELETE FROM vehicles WHERE name LIKE 'truck%';

通过父表更新子表记录

UPDATE vehicles SET color='BROWN' WHERE name='truck002';

仅更新父表记录

UPDATE ONLY vehicles SET color='BROWN' WHERE name='truck002';
  1. 继承约束条件

如果父表设置了约束,子表只会继承检查约束和非空约束,其他的不会被继承

  1. 解除继承关系

通过ALTER TABLE命令可以解除表继承关系,也可以重新构建继承关系

ALTER TABLE bikes NO INHERIT vehicles;

可以通过命令

\dS+ bikes

查看

相关文章:

【PostgreSQL】表管理-表继承

PostgreSQL 表继承 PostgreSQL 实现了表继承,这对于数据库设计人员来说是一个有用的工具。(SQL:1999 及更高版本定义了类型继承功能,该功能在许多方面与此处描述的功能不同。 让我们从一个例子开始:假设我们正在尝试…...

Dijkstra算法——邻接矩阵实现+路径记录

本文是在下面这篇文章的基础上做了一些补充,增加了路径记录的功能。具体Dijkstra的实现过程可以参考下面的这篇文章。 [jarvan:Dijkstra算法详解 通俗易懂](Dijkstra算法详解 通俗易懂 - jarvan的文章 - 知乎 https://zhuanlan.zhihu.com/p/338414118) …...

Vim基础操作

参考B站UP:正月点灯笼 vim入门教程(共3讲) 以下总结,部分搬运自评论区,楼主:-不是飞鱼QAQ,修改部分内容。 vim分为 命令 和 编辑 模式 i进入编辑模式( - - INSERT - - )…...

Mac上安装 Node.js 的版本管理工具 n,以及 n 使用,的使用

安装 最近刚更换 Mac 本进行项目的开发,刚上手 Mac 本还不是很熟练,需要安装 Node.js 的包管理工具 在 Windows 上我是实用的 nvm 来管理的 Node 版本,但是我尝试下载 Nvm ,发现下载安装后的 Nvm 无法使用,提示 “Th…...

Node.js和npm

目录 01_Node.js01.什么是 Node.js目标讲解小结 02.fs模块-读写文件目标讲解小结 03.path模块-路径处理目标讲解小结 04.案例-压缩前端html目标讲解小结 05.认识URL中的端口号目标讲解小结 06.http模块-创建Web服务目标讲解小结 07.案例-浏览时钟目标讲解小结 02_Node.js模块化…...

leetcode每日一题43

116. 填充每个节点的下一个右侧节点指针 层序遍历嘛 /* // Definition for a Node. class Node { public:int val;Node* left;Node* right;Node* next;Node() : val(0), left(NULL), right(NULL), next(NULL) {}Node(int _val) : val(_val), left(NULL), right(NULL), next(N…...

每天刷两道题——第十天

1.1和为k的子数组 给你一个整数数组 n u m s nums nums 和一个整数 k k k ,请你统计并返回 该数组中和为 k k k 的子数组的个数 。子数组是数组中元素的连续非空序列。 输入:nums [1,2,3], k 3 输出:2 前缀和 1.2如何使用 前缀和的…...

C语言入门教程,C语言学习教程(第一部分:编程基础 )一

C语言是一门面向过程的编译型语言,它的运行速度极快,仅次于汇编语言。C语言是计算机产业的核心语言,操作系统、硬件驱动、关键组件、数据库等都离不开C语言;不学习C语言,就不能了解计算机底层。 这套「C语言入门教程」…...

uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -用户信息修改实现

锋哥原创的uniapp微信小程序投票系统实战: uniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )_哔哩哔哩_bilibiliuniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )共计21条视频…...

C语言PDF编程书籍下载

[C.Primer.Plus(第6版)中文版].(美)普拉达.扫描版.pdf 链接: https://pan.baidu.com/s/1difCyykkBdLqgLu32PgYLw 密码: tv05 C语言程序设计教程_基于Visual.Cpp.6.0环境.pdf 链接: https://pan.baidu.com/s/1q3nRrRJyUd4H3Yp_PgA…...

VScode/Xshell连接学校服务器

vscode连学校服务器 1.连接atrust VPN2.Xshell连接服务器2.1创建一个自己的用户 3.xftp传文件4.vscode连接服务器4.1下载remote-ssh4.2连接服务器4.3激活conda环境4.4运行代码 5. pytorch版本不兼容解决方案 1.连接atrust VPN 如果是使用的是校园网,可以不连接 2…...

46 WAF绕过-信息收集之反爬虫延时代理池技术

目录 简要本章具体内容和安排缘由简要本课具体内容和讲课思路简要本课简要知识点和具体说明演示案例:Safedog-默认拦截机制分析绕过-未开CCSafedog-默认拦截机制分析绕过-开启CC总结: Aliyun_os-默认拦截机制分析绕过-简要界面BT(防火墙插件)-默认拦截机制分析绕过-…...

[Markdown] Markdown常用快捷键分类汇总

文章目录 Markdown1、标题2、列表3、强调4、链接和图片5、代码和公式6、表格和任务列表7、引用8、分割线9、脚注10、目录11、注释12、定义 Markdown Markdown是一种轻量级的标记语言,可以让你用简单的语法来编写格式丰富的文档。 Markdown编辑器是一种专门用于编辑…...

uniapp自定义封装只有时分秒的组件,时分秒范围选择

说实话&#xff0c;uniapp和uview的关于只有时分秒的组件实在是不行。全是日历&#xff0c;但是实际根本就不需要日历这玩意。百度了下&#xff0c;终于看到了一个只有时分秒的组件。原地址&#xff1a;原地址&#xff0c;如若侵犯请联系我删除 <template><view clas…...

SpringBoot 中 @Transactional 注解的使用

一、基本介绍 事务管理是应用系统开发中必不可少的一部分。Spring 为事务管理提供了丰富的功能支持。Spring 事务管理分为编程式和声明式的两种方式。本篇只说明声明式注解。 1、在 spring 项目中, Transactional 注解默认会回滚运行时异常及其子类&#xff0c;其它范…...

【还不了解 Dockerfile 的同学不是好测试人】

近年来 Docker 非常火&#xff0c;想要玩好 Docker 的话 Dockerfile 是绕不开的&#xff0c;这就好比想要玩好 Linux 服务器绕不开 shell 道理是一样的。 今天我们就来聊一聊 Dockerfile 怎么写&#xff0c;那些指令到底是什么意思。 前言 一、先来看一个简单的 Dockerfile #这…...

新手一键重装系统Win10步骤教程

如果我们发现电脑上的操作系统出现很严重的问题&#xff0c;不能通过简单的操作解决&#xff0c;这时候就可以选择重新安装电脑系统&#xff0c;快速解决问题。但是&#xff0c;新手用户不具备专业的装机知识&#xff0c;不知道重装Win10系统要怎么操作&#xff1f;那么可以按照…...

Ceph源码分析-在C++中,符号““和“*“有不同的用法。

在C中&#xff0c;符号"&"和"*"有不同的用法。 "&"符号&#xff1a; 在变量声明时&#xff0c;"&"用于定义引用类型。例如&#xff1a;int a 10; int& ref a; 这里的"ref"是一个引用&#xff0c;它引用了…...

Azure AI 内容安全Content Safety Studio实战

Azure AI Content Safety 检测应用程序和服务中用户生成和 AI 生成的有害内容。 Azure AI 内容安全包括文本和图像 API&#xff0c;可用于检测有害材料。 交互式 Content Safety Studio&#xff0c;可用于查看、浏览和试用用于检测不同形式的有害内容的示例代码。 关注TechLead…...

计算机网络学习笔记(四)

文章目录 1.介绍一下HTTPS的流程。2.介绍一下HTTP的失败码。3.说一说你知道的http状态码。4. 301和302有什么区别&#xff1f;5.302和304有什么区别&#xff1f;6. 请描述一次完整的HTTP请求的过程。7.什么是重定向&#xff1f;8. 重定向和请求转发有什么区别&#xff1f;9.介绍…...

typora导出html添加目录

typora导出html添加目录 使用方法 首先要从typora导出html文件&#xff0c;之后用记事本编辑器html文件 找到文档最后面&#xff0c;如图&#xff1a; 用文字编辑类工具打开sideBar.txt&#xff0c;复制其中所有内容【内容在下面】 在如上图的位置插入所复制的内容 打开修改…...

vue3 封装一个按钮组件(可自定义按钮样式)

效果图 鼠标悬浮有对应的文字提示&#xff0c;且图标出现背景色和颜色 实现 目前提供五个固定样式的图标及三个用户自定义的图标&#xff0c;可根据需要补充 组件代码 <script setup lang"ts"> import { onMounted, PropType, reactive, ref, watch } from v…...

Docker 中使用超级用户

在docker中安装keytool产生的问题&#xff1a; sudo apt-get install openjdk-8-jre-headless bash: sudo: command not found elasticsearchd989639e3cb4:~/config/certs$ apt-get install openjdk-8-jre-headless E: Could not open lock file /var/lib/dpkg/lock-frontend …...

git打tag以及拉取tag

场景&#xff1a;某次git代码发布后定版记录&#xff0c;将发版所在的commit时候代码打上tag记录&#xff0c;方便后期切换到对应tag代码位置。 查看所有tag名 git tag// 1.1.0 // 1.0.0查看tag和描述 git tag -l -n//1.0.0 云监管一期项目完结 //1.1.0 …...

TS 36.212 V12.0.0-信道编码、复用和交织(1)-通用过程

本文的内容主要涉及TS 36.212&#xff0c;版本是C00&#xff0c;也就是V12.0.0。...

纯前端上传word,xlsx,ppt,在前端预览并下载成图片(预览效果可以,下载图片效果不太理想)

纯前端上传word,xlsx,ppt,在前端预览并下载成图片&#xff08;预览效果可以&#xff0c;下载图片效果不太理想&#xff09; 一.安装依赖二、主要代码 预览效果链接: https://github.com/501351981/vue-office 插件文档链接: https://501351981.github.io/vue-office/examples/d…...

WPS Office找回丢失的工作文件

WPS office恢复办公文件方法有两种. 1.通过备份中心可以查看近期编辑 office 历史版本进行恢复. 2.缓存备份目录可以查看编辑过的 office 文件的历史版本&#xff0c;新版本 WPS 可以在配置工具-备份清理找到&#xff0c;2019 年旧版本 WPS 可以在新建任意 office 文件-文件-选…...

【MATLAB源码-第106期】基于matlab的SAR雷达系统仿真,实现雷达目标跟踪功能,使用卡尔曼滤波算法。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 1. 雷达系统参数设定&#xff1a; - 工作频率&#xff1a;选择一个适合的工作频率&#xff0c;例如X波段&#xff08;8-12 GHz&#xff09;。 - 脉冲重复频率&#xff08;PRF&#xff09;&#xff1a;设定一个适当的PR…...

【机器学习】scikit-learn机器学习中随机数种子的应用与重现

随机数种子是为了能重现某一次实验生成的随机数而设立的&#xff0c;相同的随机数种子下&#xff0c;生成的随机数序列一样 一、随机数种子基础应用 在python中简单运用随机数种子 import random random.seed(1) a random.sample(range(0,100),10) random.seed(2) b random.…...

欧洲编程语言四巨头

从左往右&#xff0c;依次是 尼克劳斯沃斯 (Niklaus Wirth)&#xff0c;迪杰斯特拉&#xff08;Edsger Dijkstra&#xff09;&#xff0c;霍尔&#xff08;Tony Hoare&#xff09; 尼克劳斯沃斯 (Niklaus Wirth) 瑞士人&#xff0c;一生发明了8种编程语言&#xff0c;其中最著…...

官方网站建设的公司/网站制作公司高端

完全查杀VIKING&#xff08;威金蠕虫&#xff09;病毒与免疫补丁 转载:[url]http://hi.baidu.com/dubatool/blog/item/0a5db3a163154f8b47106406.html[/url]完全查杀VIKING&#xff08;威金蠕虫&#xff09;病毒与免疫补丁这个威金蠕虫病毒暂时杀毒软件对它还不太管用! 方法一:…...

网站建站网站299266co/百度推广后台

只要有标准的DES加密和解密算法&#xff0c;类似ANSI-X99MAC算法和PBOC3DES算法就很好实现。他们都是用DES算法再经过一层算法实现的。实现原理看图就能看明白。3DES算法实现就更简单了。就是DES算法再加解密一次。/*********************************************************…...

wordpress加载完再显示图片/推广网站平台

USART/UART串口通信 1、USART介绍 通用同步异步收发器(Universal Synchronous Asynchronous Receiver and Transmitter)是一个串行通信设备,可以灵活地与外部设备进行全双工数据交换。 USART提供了一种灵活的方式,可以与需要行业标准 NRZ 异步串行数据格式的外部设备进行…...

怎么百度做网站/百度账号24小时人工电话

两种方式的区别 一、 # coding:utf-8 定义源代码的编码. 如果没有定义, 改源码中是不可以包含中文字符串的. 官方链接&#xff1a;https://www.python.org/dev/peps/pep-0263/ 二、sys.getdefaultencoding() 是设置默认的string的编码格式。 另外&#xff1a; 在python2…...

好的网站建设公司/今日军事新闻头条视频

一、问题描述 设计一个算法判断字符串str中每个字符是否唯一&#xff0c;例如&#xff0c;"abc"的每个字符是唯一的&#xff0c;算法返回true&#xff0c;而"accb"中字符’c’不是唯一的&#xff0c;算法返回false。 二、问题解答 解析&#xff1a;这里…...

定制头像软件/湖南靠谱seo优化公司

学习目标&#xff1a; 掌握API相关知识 学习内容&#xff1a; 1、 System类 2、 Date类和Calendar类 3、 SimpleDateFormat类 4、 BigInteger 5、 BigDecimal 学习时间&#xff1a; 2021年5月23日 学习产出&#xff1a; 提示&#xff1a;这里统计学习计划的总量 例如&#xff…...