将数据导出到另一个数据库
导出到 VERTICA 将表数据从一个 Vertica 数据库导出到另一个。需要满足以下要求:
-
您已经使用 CONNECT TO VERTICA 打开了与目标数据库的连接。
-
源数据库最多只能低于目标数据库一个主要版本。
-
目标数据库中的表必须存在。
-
源表列和目标表列必须具有相同或兼容的数据类型。
每个 EXPORT TO VERTICA 语句一次仅从一个表导出数据。您可以将相同的数据库连接用于多个导出操作。
导出过程
导出过程分为三步:
-
使用 CONNECT TO VERTICA 连接到目标数据库。
例如:
=> CONNECT TO VERTICA testdb USER dbadmin PASSWORD '' ON 'VertTest01', 5433; CONNECT
-
使用 EXPORT TO VERTICA 导出所需数据。例如,以下语句将
customer_dimension
中的所有表数据导出到目标数据库testdb
中的同名表中:=> EXPORT TO VERTICA testdb.customer_dimension FROM customer_dimension; Rows Exported --------------- 23416 (1 row)
-
DISCONNECT 当所有导出和导入操作完成后与目标数据库断开连接:
=> DISCONNECT testdb; DISCONNECT
注意
关闭会话时,数据库连接也会关闭。但是,比较好的做法是显式关闭与其他数据库的连接,从而释放资源并防止可能在会话中运行的其他 SQL 脚本出现问题。如果您在同一个会话中运行脚本并且该会话尝试打开与同一个数据库的连接,请始终关闭连接以防止出现潜在错误,因为每个会话一次只能拥有一个与给定数据库之间的连接。
源列和目标列之间的映射
如果像前面的示例一样将所有表数据从一个数据库导出到另一个数据库,则 EXPORT TO VERTICA 可以省略指定列列表。仅当两个表中的列定义都符合以下条件时,这才有可能:
-
列数相同
-
列名相同
-
列序列相同
-
列数据类型匹配或兼容
如果其中任何一个条件不成立,则 EXPORT TO VERTICA 语句必须包含列列表,这些列列表将源列和目标列显式映射到彼此,如下所示:
-
包含相同数量的列。
-
按相同顺序列出源列和目标列。
-
将具有相同(或兼容)数据类型的列配对。
例如:
=> EXPORT TO VERTICA testdb.people (name, gender, age)
FROM customer_dimension (customer_name, customer_gender, customer_age);
导出表数据的子集
通常,您可以通过两种方式导出表数据的子集:
-
导出特定源表列的数据。
-
导出源表上查询(包括历史查询)的结果集。
在这两种情况下,EXPORT TO VERTICA 语句通常必须为源表和目标表指定列列表。
以下示例将源表中的三列数据导出到目标表中的三列。因此,EXPORT TO VERTICA 语句为每个表指定一个列列表。每个列表中的列顺序决定了 Vertica 如何将目标列映射到源列。在本例中,目标列 name
、gender
和 age
分别映射到源列 customer_name
、customer_gender
和 customer_age
:
=> EXPORT TO VERTICA testdb.people (name, gender, age) FROM customer_dimension
(customer_name, customer_gender, customer_age);
Rows Exported
---------------
23416
(1 row)
下一个示例查询源表 customer_dimension
,将结果集导出到目标数据库 testdb
中的表 ma_customers
:
=> EXPORT TO VERTICA testdb.ma_customers(customer_key, customer_name, annual_income)
AS SELECT customer_key, customer_name, annual_income FROM customer_dimension WHERE customer_state = 'MA';
Rows Exported
---------------
3429
(1 row)
注意
在此示例中,源和目标列名称相同,因此为目标表ma_customers
指定列列表是可选的。如果一个或多个查询的源列在目标表中没有匹配项,则该语句将需要包含目标表的列列表。
导出标识列
您可以导出包含标识值和自动增量值的表(或列),但目标表的序列值不会自动递增。您必须使用 ALTER SEQUENCE 进行更新。
可按如下方式导出标识值和自动增量列:
-
如果源和目标表都具有标识列并且配置参数 CopyFromVerticaWithIdentity 设置为 true (1),则无需列出它们。
-
如果源表有标识列,而目标表没有,则必须显式列出源列和目标列。
当心
如果没有列出要导出的标识列,则会导致出错,因为这会解释为目标表中缺失标识列。
默认情况下,EXPORT TO VERTICA 导出所有标识列。要全局禁用此行为,请设置 CopyFromVerticaWithIdentity
配置参数。