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的方式去做表的临时备份。