将数据插入 Flex 表
您可以使用标准 INSERT 语句将数据加载到 Vertica Flex 表中,为一列或多列指定数据。当您使用 INSERT 时,Vertica 会填充所有实体化列并将 VMap 数据存储在 raw 列中。
Vertica 提供了两种将 INSERT 与 Flex 表一起使用的方法:
-
INSERT ... VALUES
-
INSERT ...SELECT
将值插入 Flex 表
要将数据值插入 Flex 表,请使用 INSERT ...VALUES 语句。如果您没有在 INSERT ...VALUES 语句中指定任何列,则 Vertica 按位置将值分配给 Flex 表的实际列。
此示例显示了将值插入简单 Flex 表的两种方法。对于这两个语句,Vertica 分别将值 1 和 'x' 分配给列 a 和 b。此示例将值插入到 Flex 表中定义的两个实际列:
=> CREATE FLEX TABLE flex0 (a INT, b VARCHAR);
CREATE TABLE
=> INSERT INTO flex0 VALUES (1, 'x');
OUTPUT
--------
1
(1 row)
此示例将值插入到没有任何实际列的 Flex 表中:
=> CREATE FLEX TABLE flex1();
CREATE TABLE
=> INSERT INTO flex1(a,b) VALUES (1, 'x');
OUTPUT
--------
1
(1 row)
对于上一个示例,raw 列包含插入的数据:
=> SELECT MapToString(__raw__) FROM flex1;
MapToString
---------------------------------
{
"a" : "1",
"b" : "x"
}
(1 row)
将 INSERT ...SELECT 与 Flex 表一起使用
将 INSERT ...SELECT 语句与 Flex 表一起使用类似于将 INSERT ...SELECT 与常规表一起使用。SELECT 语句返回要插入目标表的数据。
但是,Vertica 不要求您使列数和值数保持一致。如果您没有为列指定值,Vertica 将插入 NULL。
在下一个示例中,Vertica 从 flex1 表中复制 a 和 b 值,并创建列 c、d、e 和 f。由于该语句没有为 f 指定值,因此 Vertica 将其分配为 NULL。
=> CREATE FLEX TABLE flex2();
CREATE TABLE
=> INSERT INTO flex2(a,b) SELECT a,b, '2016-08-10 11:10' c, 'Hello' d, 3.1415 e, f from flex1;
OUTPUT
--------
1
(1 row)
=> SELECT MapToString(__raw__) FROM flex2;
MapToString
----------------------------------------------------------------------------------------------------------------
{
"a" : "1",
"b" : "x",
"c" : "2016-08-10 11:10",
"d" : "Hello",
"e" : "3.1415",
"f" : null
}
(1 row)
将 raw 列插入 Flex 表
将 raw 列插入 Flex 表会将整个源 VMap 插入到目标表中。Vertica 不会将 raw 列分配给任何目标列。它在 SELECT 语句中的位置无关紧要。
以下两个 INSERT 语句是等效的。
=> INSERT INTO flex4(a,b) SELECT a, __raw__, b FROM flex3;
=> INSERT INTO flex4(a,b) SELECT a, b, __raw__ FROM flex3;
错误处理
类型强制转换错误仅发生在实际列中。插入操作失败,如下所示:
=> CREATE FLEX TABLE my_table(a INT, b VARCHAR);
CREATE TABLE
=> INSERT INTO my_table(a, b) VALUES ('xyz', '5');
ERROR: Invalid input syntax for integer: "xyz"
如果您尝试将值插入 raw 列,则插入失败,如下所示:
=> CREATE FLEX TABLE my_table(a INT, b VARCHAR);
CREATE TABLE
=> INSERT INTO my_table(a,b,__raw__) VALUES (1,'x','abcdef');
ERROR 7372: Cannot assign value to "__raw__" column