PG数据库--表继承

一、表继承

  1. 父表与子表的关系,表访问权限并不会自动继承。
  2. 当在父表上查询数据的时候,想要知道那些出自于主表,哪些出自于继承表。可以利用tableoid,来标识数据来自于那一个表,然后再通过tableoid在pg_class表中找到对用的表 。
  3. postgresql里,一个表可以从零个或者多个其它表中继承属性,而且一个查询既可以引用一个表中的所有行,也可以引用一个表及其所有后代表的行。
  4. 子表会继承父表的所有属性
  5. 当我们向子表中插入数据的时候,父表中也会增加一条数据。
  6. 所有父表的检查约束和非空约束都会自动被子表继承。不过其他类型的约束(唯一,主键,外键约束)不会被继承。继承的一个严重局限性是索引(包括唯一约束)和外键约束只能用于单个表,而不能包括他们的子表。
  7. 如果需要继承主键和约束条件,索引等,则需要在创建的时候加上Including all 
  8. create table md_table_01(like md_table including all) inherits (md_table);
  9. 表继承通常使用 inherits 子句的 create table语句定义。
  10. 一个继承链可以使用带 no inherit 的 alter table 命令从子表上删除。
  11. alter table md_table_01 no inherit md_table;
  12. 任何存在子表的父表都不能被删除,子表中任何从父表继承的字段或约束也不能被删除或修改。
  13. 删除一个表以及其所有后代,最简单的方式是使用cascade选项删除父表。
 drop table md_table cascade;

二、ddl

        1、继承案例

父表:
CREATE TABLE
    ods_v2_yy_01_z82remrsd2
    (
        id CHARACTER VARYING(32) NOT NULL,
        mm_id CHARACTER VARYING(32) NOT NULL,
        md_name CHARACTER VARYING(64) NOT NULL,
        alias_md_name CHARACTER VARYING(128) NOT NULL,
        dw_md_name CHARACTER VARYING(63) NOT NULL,
        md_type CHARACTER VARYING(32) NOT NULL,
        md_attr CHARACTER VARYING(32),
        CONSTRAINT pk_v2_yy_01_z82rgvsefn PRIMARY KEY (id)
    );

子表:
create table ods_v2_yy_01_z82remrsd2_2021(like ods_v2_yy_01_z82remrsd2) inherits(ods_v2_yy_01_z82remrsd2);
create table ods_v2_yy_01_z82remrsd2_2022(like ods_v2_yy_01_z82remrsd2) inherits(ods_v2_yy_01_z82remrsd2);
create table ods_v2_yy_01_z82remrsd2_2023(like ods_v2_yy_01_z82remrsd2) inherits(ods_v2_yy_01_z82remrsd2);

        2.只查询父表的数据,表名前面加only

select * from ods_v2_yy_01_z82remrsd2 where id>10

        3. 查询全部,可以在表名加上*,也可以不加,不过写在表后面 写 乘号可以用于强调搜索额外的表。

select name,altitude from ods_v2_yy_01_z82remrsd2* where id>500;

<think>好的,用户想了解PostgreSQL中备份单个的具体SQL语句或方法。我需要先整理一下已有的引用内容,看看有没有相关的信息。 根据引用[1],提到了pg_dump和pg_dumpall这两个命令,但这些都是命令行工具,用户可能想要的是纯SQL的方法。引用[3]中提到了使用CREATE TABLE AS或者SELECT INTO来备份数据,比如例子里的create table if not exists employees_20231119 as select * from employees where id > 30; 还有SELECT INTO的用法。这可能就是用户需要的SQL语句方法。 另外,引用[2]里讲到了逻辑备份和物理备份的区别,其中逻辑备份包括pg_dump,而用户可能需要的是逻辑备份中的单备份。不过用户可能更倾向于直接用SQL语句而不是命令行工具。 需要注意的是,使用CREATE TABLE AS或SELECT INTO只能备份数据,不会复制的索引、约束等结构。如果需要完整备份结构,可能需要结合pg_dump的命令行工具,或者单独导出DDL语句。但用户明确询问的是SQL语句,所以重点放在SQL方法上。 还要提醒用户这种方法的优缺点,比如方便快捷但缺少索引和约束,建议在适当场景下使用。此外,引用[3]提到备份数据有索引和约束可能需要使用CREATE TABLE语句,但可能需要手动处理。例如,先创建结构,再插入数据,或者导出DDL再导入。 总结步骤应该是: 1. 使用CREATE TABLE AS或SELECT INTO备份数据。 2. 如果需要结构,可能需要生成DDL语句,或者使用pg_dump命令。 3. 注意索引和约束的问题,可能需要额外步骤。 最后,生成相关问题,比如其他备份方法、如何包含索引、如何自动化备份等。</think>### PostgreSQL备份方法与 SQL 语句详解 #### 方法一:使用 `CREATE TABLE AS` 语句(仅备份数据) 通过 SQL 语句直接创建新并复制数据,适用于快速备份单数据(**不包含索引、约束**): ```sql -- 创建新并复制数据(自动创建结构,但不包含索引、约束) CREATE TABLE 新名 AS SELECT * FROM 原名 [WHERE 条件]; -- 示例:备份 employees 中 id>30 的数据到新 employees_backup CREATE TABLE employees_backup AS SELECT * FROM employees WHERE id > 30; ``` **注意**:此方法生成的新仅有基础字段结构和数据,不包含原的索引、主键、外键等[^3]。 --- #### 方法二:使用 `SELECT INTO` 语句(仅备份数据) 功能与 `CREATE TABLE AS` 类似,但语法更简洁: ```sql SELECT * INTO 新名 FROM 原名 [WHERE 条件]; -- 示例:备份 employees 全部数据到 employees_copy SELECT * INTO employees_copy FROM employees; ``` --- #### 方法三:`pg_dump` 命令行工具(推荐,包含完整结构) 通过 PostgreSQL 自带的 `pg_dump` 工具备份单(**包含结构、索引、约束、触发器**): ```bash # 备份指定到 SQL 文件 pg_dump -U 用户名 -d 数据库-t 名 > 备份文件名.sql # 示例:备份 employees 到 employees_backup.sql pg_dump -U postgres -d mydb -t employees > employees_backup.sql ``` **优势**:生成的 SQL 文件包含完整的定义、索引、约束,且支持跨版本恢复[^1][^2]。 --- #### 方法四:通过 SQL 生成完整结构+数据(手动操作) 1. **导出结构**: ```sql -- 生成原的 CREATE TABLE 语句(包含索引、约束) \d+ 原名 ``` 手动复制生成的 DDL 语句创建新。 2. **复制数据**: ```sql INSERT INTO 新名 SELECT * FROM 原名; ``` --- ### 关键选择建议 | 场景 | 推荐方法 | 特点 | |----------------------|----------------|------------------------------------| | 快速临时备份 | `CREATE TABLE AS` | 无需命令行,但缺失索引和约束 | | 需要完整备份 | `pg_dump` | 包含所有对象,适合生产环境 | | 按条件备份部分数据 | `SELECT INTO` | 灵活筛选数据,但需手动处理结构 | --- ### 注意事项 1. 使用 `CREATE TABLE AS` 或 `SELECT INTO` 时,新的字段类型与原一致,但**不会继承默认值、自增序列**等属性[^3]。 2. 大备份建议使用 `pg_dump` 配合压缩参数(如 `-Fc` 格式)提升效率[^2]。 3. 若需优化备份性能,可参考慢 SQL 优化方法调整数据库参数[^4]。 --- 相关问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值