PostgreSql复制表使用说明

PostgreSql复制表有很多选项,有些时候做完复制表的操作,发现无法将表的描述等信息复制过去,这里详细介绍一下PostgreSql复制表的相关操作

创建测试表并写入数据

创建学生表
sql 复制代码
CREATE TABLE "public"."student" (
  "student_id" int4 NOT NULL DEFAULT nextval('student_student_id_seq'::regclass),
  "name" varchar(50) COLLATE "pg_catalog"."default" NOT NULL,
  "age" int4 NOT NULL,
  "gender" varchar(10) COLLATE "pg_catalog"."default" NOT NULL,
  "address" varchar(100) COLLATE "pg_catalog"."default" NOT NULL,
  "phone" varchar(20) COLLATE "pg_catalog"."default" NOT NULL,
  "grade" varchar(20) COLLATE "pg_catalog"."default" NOT NULL,
  CONSTRAINT "student_pkey" PRIMARY KEY ("student_id")
);

ALTER TABLE "public"."student" 
  OWNER TO "postgres";
COMMENT ON COLUMN "public"."student"."student_id" IS '学生id';
COMMENT ON COLUMN "public"."student"."name" IS '姓名';
COMMENT ON COLUMN "public"."student"."age" IS '年龄';
COMMENT ON COLUMN "public"."student"."gender" IS '性别';
COMMENT ON COLUMN "public"."student"."address" IS '地址';
COMMENT ON COLUMN "public"."student"."phone" IS '电话';
COMMENT ON COLUMN "public"."student"."grade" IS '年级';
写入数据
sql 复制代码
INSERT INTO student (name, age, gender, address, phone, grade) VALUES ('John Doe', 18, 'Male', 'Beijing', '1234567890', 'Grade 10');
INSERT INTO student (name, age, gender, address, phone, grade) VALUES ('Jane Smith', 19, 'Female', 'Shanghai', '0987654321', 'Grade 11');
INSERT INTO student (name, age, gender, address, phone, grade) VALUES ('Mike Johnson', 17, 'Male', 'Guangzhou', '9876543210', 'Grade 12');

复制学生表

sql 复制代码
CREATE TABLE student2 AS SELECT * FROM student;

发现问题

创建的student2表,没有字段描述信息

问题原因

使用CREATE TABLE student2 AS SELECT * FROM student语句复制表时,不会将字段描述复制过去。这是因为字段描述是表级别的元数据,而不是数据本身的一部分。在PostgreSQL中,字段描述存储在系统目录表中,而不是在数据表中。

因此,当使用CREATE TABLE ... AS SELECT语句复制表时,只会复制数据和字段定义,而不会复制字段描述。如果您希望复制字段描述,您需要手动为新表添加字段描述。

解决方案1

使用COMMENT语句为新表的字段添加描述:

sql 复制代码
-- 创建student2表,复制字段定义和数据
CREATE TABLE student2 AS SELECT * FROM student;

-- 为student2表的字段添加描述
COMMENT ON COLUMN student2.student_id IS '学生id';
COMMENT ON COLUMN student2.name IS '姓名';
COMMENT ON COLUMN student2.age IS '年龄';
COMMENT ON COLUMN student2.gender IS '性别';
COMMENT ON COLUMN student2.address IS '地址';
COMMENT ON COLUMN student2.phone IS '电话';
COMMENT ON COLUMN student2.grade IS '年级';

解决方案2

CREATE TABLE ... (LIKE ...) 复制表

可以使用 CREATE TABLE ... (LIKE ...) 语句来复制表,并使用 INCLUDING 子句来指定要包括的对象,要复制表并包括索引和注释。

sql 复制代码
CREATE TABLE student3 (LIKE student INCLUDING INDEXES INCLUDING COMMENTS);

查看表详情,可以看到,已经复制了表的字段描述

INCLUDING 其它选项说明
  • INCLUDING ALL:包括所有对象,相当于 INCLUDING INDEXES INCLUDING CONSTRAINTS INCLUDING DEFAULTS INCLUDING STORAGE INCLUDING COMMENTS INCLUDING STATISTICS INCLUDING GENERATED INCLUDING RULES INCLUDING TRIGGERS
  • INCLUDING INDEXES:包括表的索引。
  • INCLUDING CONSTRAINTS:包括表的约束。
  • INCLUDING DEFAULTS:包括表的默认值。
  • INCLUDING STORAGE:包括表的存储参数。
  • INCLUDING COMMENTS:包括表的注释。
  • INCLUDING STATISTICS:包括表的统计信息。
  • INCLUDING GENERATED:包括表的生成列。
  • INCLUDING RULES:包括表的规则。
  • INCLUDING TRIGGERS:包括表的触发器。

你可以根据需要选择适当的 INCLUDING 选项来复制表。

相关推荐
NCIN EXPE20 小时前
redis 使用
数据库·redis·缓存
MongoDB 数据平台20 小时前
为编码代理引入 MongoDB 代理技能和插件
数据库·mongodb
极客on之路20 小时前
mysql explain type 各个字段解释
数据库·mysql
代码雕刻家20 小时前
MySQL与SQL Server的基本指令
数据库·mysql·sqlserver
lThE ANDE20 小时前
开启mysql的binlog日志
数据库·mysql
yejqvow1221 小时前
CSS如何控制placeholder文字的颜色_使用--placeholder伪元素
jvm·数据库·python
oLLI PILO21 小时前
nacos2.3.0 接入pgsql或其他数据库
数据库
m0_7436239221 小时前
HTML怎么创建多语言切换器_HTML语言选择下拉结构【指南】
jvm·数据库·python
pele21 小时前
Angular 表单中基于下拉选择动态启用字段必填校验的完整实现
jvm·数据库·python