Sql VERTICA使用命名列在一条语句中插入多行

Sql VERTICA使用命名列在一条语句中插入多行,sql,vertica,Sql,Vertica,我想在VERTICA中高效地插入多行。在PostgreSQL(可能还有其他SQL实现)中,可以在一条语句中插入多行,这比执行单个插入(尤其是在自动提交模式下)要快得多 在新创建的表中加载两行的最小自包含示例可能如下所示(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,

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

在新创建的表中加载两行的最小自包含示例可能如下所示(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');
INSERT INTO my_schema.my_table (some_float, some_string, row_count) 
VALUES (1.0,'foo',1),(2.0,'bar',2); 
INSERT INTO my_schema.my_table SELECT 1,1.0,'foo' UNION SELECT 2,2.0,'bar';
但其美妙之处在于,这些值的排列顺序可以更改为类似于(b)

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');
INSERT INTO my_schema.my_table (some_float, some_string, row_count) 
VALUES (1.0,'foo',1),(2.0,'bar',2); 
INSERT INTO my_schema.my_table SELECT 1,1.0,'foo' UNION SELECT 2,2.0,'bar';
此外,此语法允许省略由默认值(如自动递增整数等)填充的列

然而,VERTICA似乎不可能使用相同的微调进行多行插入。事实上,模仿类似行为的唯一方法似乎是将多个选择组合在一起,例如(c)

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');
INSERT INTO my_schema.my_table (some_float, some_string, row_count) 
VALUES (1.0,'foo',1),(2.0,'bar',2); 
INSERT INTO my_schema.my_table SELECT 1,1.0,'foo' UNION SELECT 2,2.0,'bar';
答案如下:


然而,这似乎只在插入列的顺序与其初始定义的顺序匹配时起作用。我的问题是,可以像(c)那样设计单个插入,但是可以像(b)那样更改列顺序?还是我处理这个问题完全错了?如果是,除了多行插入,还有什么替代方法?我是否应该尝试复制本地?

只需在插入中列出列即可:

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
而不是
UNION
<代码>联合会产生删除重复项的开销,这是不需要的。

我正在尝试这一点,对于一个非常简单的示例,它是有效的。我对
DEFAULT
列和
TIMESTAMPS
有一些问题,我想在接受这个答案之前解决它们。我想,我明白了:如果某个地方有时间戳,单行
INSERT
有效,但多行INSERT无效。在
SELECT
中使用
来显示时间戳的显式强制转换实现了这一技巧。