PG使用 INHERITS 创建的子表注意事项

server/2024/11/28 6:29:55/

在 PostgreSQL 中,使用 INHERITS 创建的子表对主表的更改行为如下:


1. 新增字段

  • 行为:子表会自动继承主表新增的字段。

  • 示例

    CREATE TABLE parent_table (id SERIAL PRIMARY KEY, name TEXT);
    CREATE TABLE child_table () INHERITS (parent_table);ALTER TABLE parent_table ADD COLUMN age INT;
    

    结果child_table 会自动包含 age 字段。


2. 创建索引

  • 行为:主表创建的索引不会自动应用到子表。
    如果需要在子表上创建相同的索引,需手动执行或使用脚本。

  • 示例

    CREATE INDEX idx_name ON parent_table (name);
    

    结果:索引 idx_name 只存在于 parent_table,不会影响 child_table

    解决方案:使用脚本遍历子表手动创建索引。


3. 新增约束

  • 主键或唯一约束:不会自动继承,需要在每个子表中手动添加。
    ALTER TABLE parent_table ADD CONSTRAINT unique_name UNIQUE (name);
    
    结果:唯一约束只作用于主表的数据,child_table 的数据不受影响。
  • 外键约束: 不会自动继承,需要在每个子表中手动添加
-- 创建父表和引用表
CREATE TABLE referenced_table (id SERIAL PRIMARY KEY
);CREATE TABLE parent_table (id SERIAL PRIMARY KEY,ref_id INT
);-- 创建子表
CREATE TABLE child_table () INHERITS (parent_table);-- 给父表添加外键约束
ALTER TABLE parent_table ADD CONSTRAINT fk_ref FOREIGN KEY (ref_id) REFERENCES referenced_table (id);-- 结果:
parent_table 上的 ref_id 会被强制约束,必须引用 referenced_table 中的 id
child_table 不会继承此外键约束。子表中的 ref_id 列可以存储不符合外键约束的数据。如何手动为子表添加外键约束?
如果需要对子表也应用相同的外键约束,必须手动为子表添加约束:
ALTER TABLE child_table ADD CONSTRAINT fk_ref_child FOREIGN KEY (ref_id) REFERENCES referenced_table (id);
  • 检查约束(CHECK):子表会继承主表新增的检查约束。

    ALTER TABLE parent_table ADD CONSTRAINT check_age CHECK (age > 0);
    

    结果child_table 会自动继承 check_age


4. 修改字段类型

  • 行为:子表会自动继承主表字段类型的修改。

  • 示例

    ALTER TABLE parent_table ALTER COLUMN name TYPE VARCHAR(50);
    

    结果child_tablename 字段类型会自动修改为 VARCHAR(50)


5. 删除字段

  • 行为:如果在主表中删除字段,子表的对应字段也会被删除。

  • 示例

    ALTER TABLE parent_table DROP COLUMN age;
    

    结果child_tableage 字段也会被删除。


总结

主键、外键、唯一键约束以及创建索引不会继承
新增字段,删除字段,修改字段类型会继承

操作是否继承到子表备注
新增字段自动继承到子表
创建索引需手动在子表创建
新增主键/唯一约束/外键约束需手动在子表创建
新增检查约束自动继承到子表
修改字段类型自动继承到子表
删除字段自动从子表删除

http://www.ppmy.cn/server/145548.html

相关文章

Kubeadm 安装 Kubernetes 高可用集群 v1.30.0

1、修改主机名(各个节点) hostnamectl set-hostname xxx2、hosts 文件加入主机名(全部节点) cat /etc/hosts 192.168.88.5 master1 192.168.88.6 master2 192.168.88.7 master3 192.168.88.8 node13、关闭防火墙(全部…

英语知识网站:Spring Boot技术构建

6系统测试 6.1概念和意义 测试的定义:程序测试是为了发现错误而执行程序的过程。测试(Testing)的任务与目的可以描述为: 目的:发现程序的错误; 任务:通过在计算机上执行程序,暴露程序中潜在的错误。 另一个…

Fastadmin系统配置增加配置字段类型

项目有一个上传APK安装包文件的需求,使用框架自带的 ‘文件’ 类型,每次都是不同路径不同文件名。希望保持固定路径和文件名所以就自己写加了一个类型,需要修改的地方如下: 1. app\common\model\Config.php 在 getTypeList 方法中…

使用R语言绘制简单地图的教程

今天主要讲的部分是绘制静态地图,使用的R语言绘图包是tmap,关于介绍就不多讲,下面开始代码的讲解,小白也可以放心食用。 1、绘制简单的单幅地图,这里以新西兰地区为例 #导入必要的包 library(tmap) library(sp) libr…

Android 11 三方应用监听关机广播ACTION_SHUTDOWN

前言 最近有项目过程中,有做app的同事反馈,三方应用无法监听关机广播。特地研究了下关机广播为啥监听不到。 1.原因:发送关机广播的类是ShutdownThread.java,添加了flag:Intent.FLAG_RECEIVER_FOREGROUND | Intent.FLAG_RECEIVER…

spring boot框架漏洞复现

spring - java开源框架有五种 Spring MVC、SpringBoot、SpringFramework、SpringSecurity、SpringCloud spring boot版本 版本1: 直接就在根下 / 版本2:根下的必须目录 /actuator/ 端口:9093 spring boot搭建 1:直接下载源码打包 2:运行编译好的jar包:actuator-testb…

Testbench仿真脚本编写指北

[!note] 由于 Quartus 的 VWF 仿真只能仿真很短的时间,而且 Vivado 仿真的时候也需要添加激励信号,因此需要编写 testbench 文件进行激励仿真。 Testbench 文件结构 编写 testbench 的目的是为了测试 module 的功能、性能是否符合设计的预期。验证设计的…

健康养生:开启活力生活之门

在快节奏的现代生活中,人们愈发重视健康养生。它不仅是一种生活方式,更是对生命的尊重与呵护,让我们能以更佳状态迎接生活挑战,享受美好人生。 健康养生,饮食首当其冲。应秉持营养均衡的原则,确保每餐都有…