我正在尝试在加载期间创建一个验证过程,以确保数据不重复。Vertica 本身不支持此功能:
Vertica 在运行查询时检查约束违规,而不是在加载数据时检查。要在加载过程中检测约束违规,请使用带有 NO COMMIT 选项的 COPY(第 667 页)语句。通过加载数据而不提交数据,您可以使用 ANALYZE_CONSTRAINTS 函数对数据进行加载后检查。如果函数发现约束违反,您可以回滚加载,因为您尚未提交它。
问题是我无法弄清楚如何以编程方式执行此操作。我怀疑我需要一个存储过程,但我不熟悉 vertica 的存储过程语法/限制。你能帮我吗?这是我所拥有的:
-- Create a new table. "id" is auto-incremented and "name" must be unique
CREATE TABLE IF NOT EXISTS my_table (
id IDENTITY
, name varchar(50) UNIQUE NOT NULL
, type varchar(20)
, description varchar(200)
);
--Insert a record
begin;
copy my_table from stdin
abort on error
NO COMMIT; -- this begins the load
name1|type1|description1 --this is the load
\. -- this closes the load
commit;
-- insert the duplicate record
begin;
copy my_table from stdin
abort on error
NO COMMIT; -- this begins the load
name1|type1|description1 --this is the load
\. -- this closes the load
commit; -- Surprisingly, the load executes successfully! What's going on?!?!
-- Check constraints. We see that there is a failed constraints:
select analyze_constraints('my_table');
我的想法是做一些条件逻辑。伪代码如下。你能帮我为 Vertica 做准备吗?
Begin
load data
if (select count(*) from (select analyze_constraints('my_table')) sub) == 0:
commit
else rollback