【问题标题】:VERTICA insert multiple rows in one statement with named columnsVERTICA 在一个带有命名列的语句中插入多行
【发布时间】:2018-08-22 13:38:07
【问题描述】:

我想有效地将​​多行插入到 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); 

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

但是,VERTICA 似乎无法进行具有相同微调的多行插入。事实上,模拟类似行为的唯一方法似乎是 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吗?

【问题讨论】:

    标签: sql vertica


    【解决方案1】:

    只需列出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 会产生删除重复项的开销,这不是必需的。

    【讨论】:

    • 我正在尝试这个,举一个非常简单的例子,它可以工作。我对DEFAULT 列和TIMESTAMPS 有一些问题,我想在接受这个答案之前弄清楚它们。
    • 我想,我明白了:如果某处有时间戳,则单行 INSERT 有效,但多行插入无效。在SELECT 中使用TO_TIMESTAMP 显式转换就可以了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-30
    • 2013-01-13
    • 2014-06-10
    • 2015-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多