VERTICA在一个带有命名列的语句中插入多行

时间:2018-08-22 13:38:07

标签: sql vertica

我想将多个行有效地插入VERTICA。在PostgreSQL(以及可能的其他SQL实现)中,可以在一个语句中INSERT行多行,这比单次插入(特别是在自动提交模式下)要快得多。

一个在新创建的表中加载两行的最小自包含示例如下所示:(a)

CREATE TABLE my_schema.my_table (
row_count int,
some_float float,
some_string varchar(8));

INSERT INTO my_schema.my_table (row_count, some_float, some_string) 
VALUES (1,1.0,'foo'),(2,2.0,'bar');

但是,这样做的好处是,可以将值的束缚顺序更改为(b)

INSERT INTO my_schema.my_table (some_float, some_string, row_count) 
VALUES (1.0,'foo',1),(2.0,'bar',2); 

此外,此语法还允许省略列,然后将其填充为默认值(例如,自动递增整数等)。

但是,VERTECA似乎没有可能用相同的微调进行多行插入。实际上,模拟类似行为的唯一方法似乎是UNION一起为(c)

之类的多个选择进行选择。
INSERT INTO my_schema.my_table SELECT 1,1.0,'foo' UNION SELECT 2,2.0,'bar';

如该答案:Vertica SQL insert multiple rows in one statement

但是,这似乎仅在插入的列的顺序与其初始定义的顺序匹配时有效。我的问题是,可以制作像(c)这样的单个插入物,但是可以像(b)中那样更改列顺序吗?还是我解决这个问题完全错了?如果是这样,那么多行插入有什么选择?我应该尝试COPY LOCAL吗?

1 个答案:

答案 0 :(得分:2)

Just list the columns in the insert:

INSERT INTO my_schema.my_table (row_count, some_float, some_string)
    SELECT 1,1.0,'foo'
    UNION ALL
    SELECT 2,2.0,'bar';

Note the use of UNION ALL instead of UNION. UNION incurs overhead for removing duplicates, which is not needed.