PostgreSQL 复制表的 5 种方式

news/2024/12/29 16:28:12/

PostgreSQL 提供了多种不同的复制表的方法,它们的差异在于是否需要复制表结构或者数据。

CREATE TABLE AS SELECT 语句

CREATE TABLE AS SELECT 语句可以用于复制表结构和数据,但是不会复制索引。

我们可以使用以下语句基于 employee 复制一个新表 emp2,包括表中的数据:

CREATE TABLE emp2 
AS
SELECT * FROM employee;

如果只想要复制表结构,不复制数据,可以增加 WITH NO DATA 子句:

CREATE TABLE emp2 
AS
SELECT * FROM employee
WITH NO DATA;

或者也可以使用一个不返回任何结果的查询语句,例如:

CREATE TABLE emp2 
AS
SELECT * FROM employee
WHERE FALSE;

这种复制方法不会创建任何索引或者约束,例如主键、外键以及 NOT NULL 约束等。

CREATE TABLE LIKE 语句

CREATE TABLE LIKE 语句也可以用于复制表结构:

CREATE TABLE emp3 
(LIKE employee);

语法中的括号是必不可少的,而且这种方法不会复制数据,但是会复制字段的 NOT NULL 约束。

CREATE TABLE AS TABLE 语句

CREATE TABLE AS TABLE 语句可以复制表结构和数据,例如:

CREATE TABLE emp4 
AS 
TABLE employee;

这种语法不会复制索引、外键以及非空约束等。

如果不需要复制数据,可以使用 WITH NO DATA 子句:

CREATE TABLE emp4 
AS 
TABLE employee
WITH NO DATA;

SELECT INTO 语句

SELECT INTO 语句可以复制表结构和数据,但是不包含索引等。例如:

SELECT * INTO emp5 FROM employee;

PostgreSQL 推荐使用 CREATE TABLE AS 替代 SELECT INTO 语句实现类似效果,因为前者适用性更广,功能更全。

CREATE TABLE INHERITS 语句

PostgreSQL 支持 CREATE TABLE 语句的 INHERIT 子句,用于继承表结构。这种复制表的方法和其他方法有所区别,任何针对父表的修改通常也会自动修改子表。

另外,这种方法还可以为子表定义额外的字段。例如:

CREATE TABLE emp5 (notes text NOT NULL
) 
INHERITS ( employee );

其中,notes 是我们额外定义的字段,其他字段继承 employee。

使用 psql \d 命令查看 emp5 的结构如下:

\d emp5Table "public.emp5"Column   |          Type          | Collation | Nullable | Default
-----------+------------------------+-----------+----------+---------emp_id    | integer                |           | not null |emp_name  | character varying(50)  |           | not null |sex       | character varying(10)  |           | not null |dept_id   | integer                |           | not null |manager   | integer                |           |          |hire_date | date                   |           | not null |job_id    | integer                |           | not null |salary    | numeric(8,2)           |           | not null |bonus     | numeric(8,2)           |           |          |email     | character varying(100) |           | not null |notes     | text                   |           | not null |
Check constraints:"ck_emp_salary" CHECK (salary > 0::numeric)"ck_emp_sex" CHECK (sex::text = ANY (ARRAY['男'::character varying, '女'::character varying]::text[]))
Inherits: employee

http://www.ppmy.cn/news/13126.html

相关文章

1个 30多年程序员的生涯经验总结

有人说:一个人从1岁活到80岁很平凡,但如果从80岁倒着活,那么一半以上的人都可能不凡。 生活没有捷径,我们踩过的坑都成为了生活的经验,这些经验越早知道,你要走的弯路就会越少。 在我30多年的程序员生涯里…

电脑开机出现绿屏错误无法启动怎么办?

电脑开机出现绿屏错误无法启动怎么办?有用户电脑开机的时候,突然出现了屏幕变成绿色的情况,而且上面有很多的错误代码。然后卡在页面上一直无法进入到桌面,重启电脑后依然无效。那么如何去解决这个问题呢?来看看具体的…

Linux 命令(245)—— chage 命令

文章目录1.命令简介2.命令格式3.选项说明4.常用示例参考文献1.命令简介 chage 修改用户密码过期信息。 chage 可以更改密码修改之间的天数和上次更改密码的日期。系统使用此信息来确定用户何时必须修改其密码。 chage 也可以设置帐户的过期时间。 2.命令格式 chage [optio…

OpenAI DALL·E 绘画机器人

快过年了,在公司也没啥任务,索性尝试使用OpenAI的DALLE生成一些好玩的图片。 OpenAI DALLE 官方介绍: DALLE 是一种由 OpenAI 开发的大型语言模型,其能够通过生成图像和文本来完成各种任务。其名称来源于绘画机器人 WALLE 和艺术家…

【论文精选】TPAMI2020 - PFENet_先验引导的特征富集网络_小样本语义分割

【论文精选】TPAMI2020 - PFENet_先验引导的特征富集网络_小样本语义分割 精选精析: 【论文原文】: Prior Guided Feature Enrichment Network for Few-Shot Segmentation (当前引用次数:184) 【论文代码】: https://github.co…

基于K8S+eureka的java应用快速上下线的WEB平台

刚进公司时,由于历史原因,应用发布通过:发布新版(新老并存)->下线老版->删除老版的方式,每次通过手工处理,蛋疼(不方便且高风险)。于是马上写了比较直观的脚本方案…

<队列>的概念结构实现【C语言版】

1.队列的概念及结构 队列对于临时数据的处理也十分有趣,它跟栈一样都是有约束条件的数组(或者链表)。区别在于我们想要按什么顺序去处理数据,而这个顺序当然是要取决于具体的应用场景。 你可以将队列想象成是电影院排队。排在最…

数据结构之经典八大排序的实现(万字详谈)

文章目录前言1.插入排序2.希尔排序3.选择排序4.堆排序5.冒泡排序6.快速排序hoare方式版本快排实现非递归方式实现快排挖坑法实现快排前后指针法(双指针法)快排的各种优化1.减少后几层的递归调用(小区间优化)2.三数取中优化3.三路划分(处理大量重复数据&a…