【问题标题】:Unique Contrains in Vertica DBVertica DB 中的独特约束
【发布时间】:2014-09-24 14:27:49
【问题描述】:

免责声明:我的 DB 知识主要来自 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,并且对于每个查询都不会检测到约束违规,因为它们位于单独的事务中,这将导致重复数据。

有没有更好的方法来防止这种情况发生?或者我错过了一些东西。

【问题讨论】:

    标签: database transactions unique-constraint vertica


    【解决方案1】:

    由于与操作相关的潜在开销,Vertica 不会强制执行主键的唯一性或负载的唯一性约束。

    如果ANALYZE_CONSTRAINTS() 在提交之前运行,您应该能够捕获潜在的重复项。做UPDATEs 也有开销,应该避免这些开销。

    有一些方法可以在加载时强制执行唯一性,例如使用MERGE,或将数据暂存到临时表中。每种方法都有其自身的局限性。您可以在我的blog post 中阅读有关强制数据唯一性的更多信息。

    更新:从 7.2 开始,Vertica 可以自动强制执行主键和唯一键约束。请参阅documentation 了解更多信息。

    【讨论】:

    • 澄清一下,ANALYZE_CONSTRAINS() 在它运行的事务范围内运行,对吗?如果另一个并行事务正在执行,他们都不会“看到”他们彼此即将违反约束?
    • @phraktal 应该与事务隔离。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-09
    • 1970-01-01
    • 2012-01-22
    • 2016-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多