openGauss 每日一练第 13 天学习打卡,巩固 openGauss 数据库数据导入基本操作!
学习目标
学习 openGauss 数据导入管理
前面每日一练链接:
openGauss每日一练第 1 天 | 数据库和表的基本操作(一)
openGauss每日一练第 2 天 | 数据库和表的基本操作(二)
openGauss每日一练第 3 天 | 前三课作业实操练习
openGauss每日一练第 4 天 | 角色管理及课后作业
openGauss每日一练第 5 天 | 用户管理及课后作业
openGauss每日一练第 6 天 | 模式管理及课后作业
openGauss每日一练第 7 天 | 表空间管理及课后作业
openGauss每日一练第 8 天 | 分区表管理及课后作业
openGauss每日一练第 9 天 | 普通表索引管理及课后作业
openGauss每日一练第 10 天 | 分区表索引管理及课后作业
openGauss每日一练第 11 天 | 视图管理及课后作业
openGauss每日一练第 12 天 | 自定义数据类型管理及课后作业
课程学习
openGauss 数据库数据导入基本操作!openGauss 数据库提供了灵活的数据入库方式:INSERT、COPY 以及 gsql 元命令 \copy。各方式具有不同的特点,具体请参见表1。
| 方式 | 特点 |
|---|---|
| INSERT | 通过 INSER T语句插入一行或多行数据,及从指定表插入数据。 |
| COPY | 通过 COPY FROM STDIN 语句直接向 openGauss 数据库写入数据。通过 JDBC 驱动的 CopyManager 接口从其他数据库向openGauss 数据库写入数据时,具有业务数据无需落地成文件的优势。 |
| gsql 工具的元命令 \copy | 与直接使用 SQL 语句 COPY 不同,该命令读取/写入的文件只能是 gsql 客户端所在机器上的本地文件。说明:\COPY 只适合小批量、格式良好的数据导入,不会对非法字符做预处理,也无容错能力,无法适用于含有异常数据的场景。导入数据应优先选择 COPY。 |
| gs_restore | gs_restore 是 openGauss 数据库提供的与 gs_dump 配套的导入工具。通过该工具,可将 gs_dump 导出的文件导入至数据库。gs_restore 支持导入的文件格式包含自定义归档格式、目录归档格式和 tar 归档格式。 |
注意:在启动 gsql 的命令行中加上“-E”参数,就可以把 gsql 中各种以“\”开头的命令执行的实际 SQL 语句打印出来.如果在已运行的 gsql 中显示了某个命令实际执行的 SQL 语句后又想关闭此功能,该怎么办?这时可以使用“\set ECHO_HIDDEN on|off”命令。
连接 openGauss
su - omm
gsql -r
gsql -r -h localhost -U user1 -W JiekeXu12 -d postgres
1.通过 INSERT 语句直接写入数据
CREATE TABLE reason_t1
(
r_reason_sk integer,
r_reason_id character(16),
r_reason_desc character(100)
);
insert into reason_t1 values(1, 'AAAAAAAABAAAAAAA', 'reason1');
–没有数值的字段将被填充为字段的缺省值
insert into reason_t1 values(1, 'AAAAAAAABAAAAAAA');
–明确字段为缺省值
insert into reason_t1 values(1, 'AAAAAAAABAAAAAAA', DEFAULT);
–明确整行为缺省值
insert into reason_t1 DEFAULT VALUES;
select * from reason_t1;

–指定表插入数据到当前表
CREATE TABLE reason_t2
(
r_reason_sk integer,
r_reason_id character(16),
r_reason_desc character(100)
);
–将查询结果作为插入的数据
INSERT INTO reason_t2 SELECT * FROM reason_t1;
select * from reason_t2;

2.使用合并方式更新和插入数据
–创建源表products,并插入数据
CREATE TABLE products
( product_id INTEGER,
product_name VARCHAR2(60),
category VARCHAR2(60)
);
INSERT INTO products VALUES
(1502, 'olympus camera', 'electrncs'),
(1601, 'lamaze', 'toys'),
(1666, 'harry potter', 'toys'),
(1700, 'wait interface', 'books');
–创建目标表newproducts,并插入数据
CREATE TABLE newproducts
( product_id INTEGER,
product_name VARCHAR2(60),
category VARCHAR2(60)
);
INSERT INTO newproducts VALUES
(1501, 'vivitar 35mm', 'electrncs'),
(1502, 'olympus ', 'electrncs'),
(1600, 'play gym', 'toys'),
(1601, 'lamaze', 'toys'),
(1666, 'harry potter', 'dvd');
omm=# select * from products;
product_id | product_name | category
------------+----------------+-----------
1502 | olympus camera | electrncs
1601 | lamaze | toys
1666 | harry potter | toys
1700 | wait interface | books
(4 rows)
omm=# select * from newproducts;
product_id | product_name | category
------------+--------------+-----------
1501 | vivitar 35mm | electrncs
1502 | olympus | electrncs
1600 | play gym | toys
1601 | lamaze | toys
1666 | harry potter | dvd
(5 rows)

–使用MERGE INTO 语句将源表products的数据合并至目标表newproducts
MERGE INTO newproducts np
USING products p
ON (np.product_id = p.product_id )
WHEN MATCHED THEN
UPDATE SET np.product_name = p.product_name, np.category = p.category
WHEN NOT MATCHED THEN
INSERT VALUES (p.product_id, p.product_name, p.category) ;
–查询合并后的目标表newproducts。
SELECT * FROM newproducts;

3.使用COPY实现表和文件间的拷贝
–将表数据输出到stdout
copy reason_t1 to stdout;
omm=# copy reason_t1 to stdout;
1 AAAAAAAABAAAAAAA reason1
1 AAAAAAAABAAAAAAA \N
1 AAAAAAAABAAAAAAA \N
\N \N \N
omm=#
–将表数据拷贝到文件
copy reason_t1 to '/home/omm/reason.dat';
CREATE TABLE reason_t3 (LIKE reason_t1);
–将数据从文件拷贝到表
copy reason_t3 from '/home/omm/reason.dat';
select * from reason_t3;
omm=# select * from reason_t3;
r_reason_sk | r_reason_id | r_reason_desc
-------------+------------------+------------------------------------------------------------------------------------------------------
1 | AAAAAAAABAAAAAAA | reason1
1 | AAAAAAAABAAAAAAA |
1 | AAAAAAAABAAAAAAA |
| |
(4 rows)
omm=# \q
omm@modb:~$ ls -l
total 4
-rw------- 1 omm omm 173 Dec 16 20:12 reason.dat

课程作业
1.创建表1并在表中插入数据,分别指定字段和整行为缺省值
create database jiekexu;
\c jiekexu
CREATE TABLE product
( product_id INTEGER,
product_name VARCHAR2(60),
category VARCHAR2(60)
);
INSERT INTO product VALUES
(1502, 'olympus camera', 'electrncs'),
(1601, 'lamaze', 'toys'),
(1666, 'harry potter', 'toys'),
(1700, 'wait interface', 'books');
insert into product values(1, 'ABAA');
insert into product DEFAULT VALUES;

2.创建表2并将表1的数据全部导入表2中
CREATE TABLE product2
(
r_reason_sk integer,
r_reason_id character(16),
r_reason_desc character(100)
);
INSERT INTO product2 SELECT * FROM product;
select * from product2;

3.创建表3和表4,并合并两个表的数据到表3
CREATE TABLE product3
( product_id INTEGER,
product_name VARCHAR2(60),
category VARCHAR2(60)
);
INSERT INTO product3 VALUES
(1502, 'olympus camera', 'electrncs'),
(1601, 'lamaze', 'toys'),
(1666, 'harry potter', 'toys'),
(1700, 'wait interface', 'books');
CREATE TABLE product4
( product_id INTEGER,
product_name VARCHAR2(60),
category VARCHAR2(60)
);
INSERT INTO product4 VALUES
(1501, 'vivitar 35mm', 'electrncs'),
(1502, 'olympus ', 'electrncs'),
(1600, 'play gym', 'toys'),
(1601, 'lamaze', 'toys'),
(1666, 'harry potter', 'dvd');
MERGE INTO product3 p3
USING product4 p4
ON (p3.product_id = p4.product_id )
WHEN MATCHED THEN
UPDATE SET p3.product_name = p4.product_name, p3.category = p4.category
WHEN NOT MATCHED THEN
INSERT VALUES (p4.product_id, p4.product_name, p4.category) ;


4.将表 3 的数据输出到文件,再将文件中的数据导入到表 5
copy product3 to '/home/omm/product3.dat';
CREATE TABLE product5 (LIKE product4);
copy product5 from '/home/omm/product3.dat';
select * from product5;

欧耶,第十三课数据导入管理实操及课后作业练习题完成啦!第十四课见!!!




