暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

GuassDB数据库深层复制功能验证

原创 辣·王爷 | 华峰 2023-08-17
247

GuassDB数据库深层复制功能验证

1 使用CREATE TABLE执行深层复制

所使用语句包含:CREATE TABLE语句和INSERT INTO…SELECT语句

复制逻辑:先创建一张和原表表结构一致的的表,然后使用insert into的方式把原表数据复制进目标表;

演示:现有一张表products,表结构和数据如图

 

1.  创建一张新表

create table products_copy (

product_id int,

product_name varchar2(60),

category varchar2(60)

);

2.  把原表数据复制进新表

INSERT INTO products_copy (SELECT * FROM products);

 

3.  删除原始表。

gaussdb=# DROP TABLE products;

4.  使用ALTER TABLE语句将副本重命名为原始表名称。

gaussdb=# ALTER TABLE products_copy  RENAME TO products;

 

该方法使用CREATE TABLE语句创建原始表的副本,将原始表的数据填充至副本并重命名副本,完成原始表的复制。

在创建新表时,可以指定表以及列属性,比如主键,索引等。但是在复制数据流程上较为繁琐和笨拙。

2 CREATE TABLE LIKE执行深层复制

1.    使用CREATE TABLE LIKE语句创建表products的副本products_copy。

gaussdb=# CREATE TABLE products_copy (LIKE products);

2.    使用INSERT INTO…SELECT语句向副本填充原始表中的数据。

gaussdb=# INSERT INTO products_copy (SELECT * FROM products);

3.    删除原始表。

gaussdb=# DROP TABLE products;

 

4.    使用ALTER TABLE语句将副本重命名为原始表名称。

gaussdb=# ALTER TABLE products_copy RENAME TO products;

 

该方法使用CREATE TABLE LIKE语句创建原始表的副本,将原始表的数据填充至副本并重命名副本,完成原始表的复制。该方法不继承父表的主键属性.。

3. CREATE TABLE  … AS  执行深层复制

CREATE TABLE AS创建一个表并且用来自SELECT命令的结果填充该表。该表的字段和SELECT输出字段的名称及数据类型相关。不过用户可以通过明确地给出一个字段名称列表来覆盖SELECT输出字段的名称。

 

CREATE TABLE AS对源表进行一次查询,然后将数据写入新表中,而查询视图结果会根据源表的变化而有所改变。相比之下,每次做查询的时候,视图都重新计算定义它的SELECT语句。

 

CREATE TABLE products_copy as select * from products;

 

这种复制方式把建表和复制语句合成一个SQL语句执行,在使用上效率更高,是开发人员首先的备份数据方式,但是也有和 like一样的缺陷,那就是无法继承父表的主键属性等。

4.通过创建临时表执行深层复制

本地会话临时表只在当前会话可见,本会话结束后会自动删除,释放资源。因此,在除当前会话连接的数据库节点故障时,仍然可以在当前会话上创建和使用临时表。由于临时表只在当前会话创建,对于涉及对临时表操作的DDL语句,会产生DDL失败的报错。因此,建议DDL语句中不要对临时表进行操作。

 

create or REPLACE  procedure  table_tmp()

AS

BEGIN

drop table if EXISTS products_1;

create temp table products_1 as select * from products;  --临时表 只复制数据和结构,不复制主键索引等。

select * from products_1;

 

 

drop table  if EXISTS products_2 ;

create temp table products_2

(product_id int PRIMARY KEY,

product_name varchar2(60),

category varchar2(60)

);

INSERT into products_2 (select * from products);

select * from products_2;

 

end;

总结:

1. 数据库开发人员在日常使用过程中,建议使用create table as的方式去做表的临时备份。

2. 在业务逻辑存储过程和函数的开发工作中建议多使用本地会话临时表的方式,这样可以把大段的业务逻辑拆分成各个小的段落,方便过程的调试,数据的排查,增强存储过程的可读性和后期的维护的方便。

最后修改时间:2023-08-18 10:11:07
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论