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
而不是 UNION
。 UNION
会产生删除重复项的开销,这是不需要的。
我想高效地将多行插入到 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
而不是 UNION
。 UNION
会产生删除重复项的开销,这是不需要的。