VERTICA 在具有命名列的一条语句中插入多行

VERTICA insert multiple rows in one statement with named columns

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

在新创建的 table 中加载两行的最小独立示例可能如下所示 (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); 

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

但是,VERTICA 似乎无法通过相同的微调进行多行插入。事实上,模拟类似行为的唯一方法似乎是 UNION 几个选择一起选择 (c):

INSERT INTO my_schema.my_table SELECT 1,1.0,'foo' UNION SELECT 2,2.0,'bar';

如本回答所示: .

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

只需列出 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';

请注意使用 UNION ALL 而不是 UNIONUNION 会产生删除重复项的开销,这是不需要的。