COPY_TABLE
将一个表复制到另一个表。此轻量级内存函数从源表复制 DDL 及所有用户创建的投影。同时,还会复制源表的投影统计信息。因此,源表和目标表最初具有相同的定义并共享同一个存储。
注意
虽然它们共享存储空间,但 Vertica 将这些表区视为独立对象来许可容量。例如,1 TB 表及其副本最初只消耗 1 TB 空间。但是,Vertica 许可证将它们视为独立对象,占用 2 TB 空间。完成复制操作后,源表与复制表相互独立,因此可以对一个表执行 DML 操作而不会影响另一个表。这些操作可增加两个表所需的存储总量。
当心
如果为同一个表同时创建多个副本,则其中一项或多项复制操作可能会失败。相反,需按顺序复制表。这是元函数。您必须在顶级 SELECT 语句中调用元函数。
行为类型
易变语法
COPY_TABLE (
'[[database.]schema.]source-table',
'[[database.]schema.]target-table'
)
参数
-
[database.]schema
数据库和架构。默认架构为
public
。如果指定一个数据库,它必须是当前数据库。-
source‑table
- 要复制的源表。Vertica 将此表中的所有数据复制到目标表。
-
目标表
- 源表的目标表。如果目标表已存在,Vertica 会将源附加到现有表。
如果该表不存在,Vertica 将根据源表的定义,通过调用
CREATE TABLE
包含LIKE
和INCLUDING PROJECTIONS
子句来创建一个表。该新表会从源表中继承所有权。有关详细信息,请参阅复制表。
特权
非超级用户:
-
源表:SELECT
-
目标架构/表(新建): CREATE
-
目标表(现有):INSERT
表属性要求
两个表的以下属性必须完全相同:
-
列定义,其中包括 NULL/NOT NULL 约束
-
分段
-
分区表达式
-
投影数量
-
投影排序顺序
-
主键和唯一键约束。但是,不必以完全相同的方式启用键约束。
注意
如果目标表已启用主键或唯一键约束,并且移动分区会将重复的键值插入到目标表中,那么 Vertica 将回退此操作。强制执行约束需要读取磁盘,而且可能会减慢复制过程。 -
文本索引的数量和定义。
-
如果目标表已存在,则源表和目标表必须具有相同的访问策略。
此外,如果源表上存在访问策略,则必须满足以下条件:
-
两个表上的访问策略必须相同。
-
以下其中一项必须为真:
-
执行用户拥有源表。
-
AccessPolicyManagementSuperuserOnly
设置为 true。有关详细信息,请参阅管理访问策略。
-
表限制
以下限制适用于源表和目标表:
-
如果源分区和目标分区位于不同的存储层中,Vertica 将返回一个警告,但操作继续进行。分区仍然位于它们的现有存储层中。
-
如果源表包含序列,Vertica 会先将序列转换为整数,然后再将其复制到目标表。如果目标表包含自动增量、标识或命名序列列,Vertica 将取消复制并显示错误消息。
-
不能将以下表用作源表或目标表:
-
临时表
-
虚拟表
-
系统表
-
外部表
-
示例
如果调用 COPY_TABLE 且目标表不存在,该函数将自动创建此表。在下例中,COPY_TABLE 创建目标表 public.newtable
。Vertica 还会复制与源表 public.product_dimension
关联的所有约束,外键约束除外:
=> SELECT COPY_TABLE ( 'public.product_dimension', 'public.newtable');
-[ RECORD 1 ]--------------------------------------------------
copy_table | Created table public.newtable.
Copied table public.product_dimension to public.newtable