使用 COPY 查询在 Vertica 中插入唯一记录
Insert Unique Records in Vertica with COPY query
我是 Vertica DB 的新手,我之前使用过 Mysql。
我想在 vertica table 中插入唯一记录,但 vertica 在插入时不支持唯一约束。
我正在通过 COPY 查询在 table 中插入记录。
所以我无法在插入前检查每条记录,是否存在。
有人可以帮助我优化独特插入的方式吗?
提前致谢:)
您可以在 COPY
和 运行 ANALYZE_CONSTRAINTS
之前添加 NO COMMIT
COMMIT
:
dbadmin=> CREATE TABLE tbl (a int PRIMARY KEY);
CREATE TABLE
dbadmin=> COPY tbl FROM STDIN NO COMMIT;
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>> 1
>> 2
>> 2
>> 3
>> \.
dbadmin=> SELECT * FROM tbl;
a
---
1
2
2
3
(4 rows)
dbadmin=> SELECT ANALYZE_CONSTRAINTS('tbl');
Schema Name | Table Name | Column Names | Constraint Name | Constraint Type | Column Values
-------------+------------+--------------+-----------------+-----------------+---------------
public | tbl | a | C_PRIMARY | PRIMARY | ('2')
(1 row)
dbadmin=> DELETE FROM tbl WHERE a = 2;
OUTPUT
--------
2
(1 row)
dbadmin=> COMMIT;
COMMIT
dbadmin=> SELECT * FROM tbl;
a
---
1
3
(2 rows)
这显然是一个简单的例子。
我在我的博客 post、Enforcing Uniqueness of Data on Load 上讨论了这个主题。
更新: 从 7.2 开始,Vertica 可以自动 enforce PRIMARY and UNIQUE constraints 加载。
执行此操作的另一种方法,尤其是当您尝试执行 UPSERTS 时,是将 COPY 复制到临时 table 中,然后使用 MERGE 语句。这会将临时 table 中的数据合并到您的 table 中,而不会出现重复的风险。它在加载批量数据时非常高效。如果您查看有关临时 tables 和 MERGE 的文档,您应该能够理解如何使用它们。
我是 Vertica DB 的新手,我之前使用过 Mysql。 我想在 vertica table 中插入唯一记录,但 vertica 在插入时不支持唯一约束。 我正在通过 COPY 查询在 table 中插入记录。 所以我无法在插入前检查每条记录,是否存在。 有人可以帮助我优化独特插入的方式吗?
提前致谢:)
您可以在 COPY
和 运行 ANALYZE_CONSTRAINTS
之前添加 NO COMMIT
COMMIT
:
dbadmin=> CREATE TABLE tbl (a int PRIMARY KEY);
CREATE TABLE
dbadmin=> COPY tbl FROM STDIN NO COMMIT;
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>> 1
>> 2
>> 2
>> 3
>> \.
dbadmin=> SELECT * FROM tbl;
a
---
1
2
2
3
(4 rows)
dbadmin=> SELECT ANALYZE_CONSTRAINTS('tbl');
Schema Name | Table Name | Column Names | Constraint Name | Constraint Type | Column Values
-------------+------------+--------------+-----------------+-----------------+---------------
public | tbl | a | C_PRIMARY | PRIMARY | ('2')
(1 row)
dbadmin=> DELETE FROM tbl WHERE a = 2;
OUTPUT
--------
2
(1 row)
dbadmin=> COMMIT;
COMMIT
dbadmin=> SELECT * FROM tbl;
a
---
1
3
(2 rows)
这显然是一个简单的例子。
我在我的博客 post、Enforcing Uniqueness of Data on Load 上讨论了这个主题。
更新: 从 7.2 开始,Vertica 可以自动 enforce PRIMARY and UNIQUE constraints 加载。
执行此操作的另一种方法,尤其是当您尝试执行 UPSERTS 时,是将 COPY 复制到临时 table 中,然后使用 MERGE 语句。这会将临时 table 中的数据合并到您的 table 中,而不会出现重复的风险。它在加载批量数据时非常高效。如果您查看有关临时 tables 和 MERGE 的文档,您应该能够理解如何使用它们。