免责声明:我的数据库知识主要来自Mysql,所以我可能会误解Vertica中的一些事情......
我想知道是否存在一种在vertica中插入/更新值的技术,同时在多个会话中强制执行唯一约束。我们假设我有一张桌子:
'id', 'unique_field', 'some_filed'
而且unique_field有一个独特的约束。我的理解是,在vertica中,首先需要执行插入,然后执行ANALYZE_CONSTRAINTS以验证是否违反了约束。在我的特定情况下,我有多个会话将INSERTS执行到同一个表,他们可能会尝试推送相同的记录。单个会话的顺序似乎是:
Insert into table (id, unique_field, some_field) values (5, 'abc', 'data');
SELECT ANALYZE_CONSTRAINTS(table);
COMMIT;
如果我在两个单独的会话中运行此序列,则两个查询都有可能尝试插入相同的unique_field,并且对于每个查询都不会检测到因为它们处于单独的事务中而发生的约束冲突,这将是导致重复数据。
有没有更好的方法来防止这种情况发生?或者我错过了什么。
答案 0 :(得分:3)
由于与操作相关的潜在开销,Vertica不会强制主键的唯一性或对加载的唯一约束。
如果在提交之前运行ANALYZE_CONSTRAINTS()
,您应该能够捕获潜在的重复项。执行UPDATE
也会产生开销,应该避免这些开销。
有一些方法可以在加载时强制执行唯一性,例如使用MERGE
或在临时表中暂存数据。每种方法都有其自身的局限性。您可以在我的blog post中详细了解如何强制执行数据的唯一性。
更新:从7.2开始,Vertica可以自动强制执行主要和唯一键约束。有关详细信息,请参阅documentation。