2014-09-24 59 views
1

免責聲明:我的DB知識大多來自Mysql的,所以我可能誤解在Vertica的一些事情...獨特Contrains在Vertica的DB

我想知道如果存在插入/更新中值的技術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併爲他們每個人將不會有約束因爲它們在單獨的事務中檢測到違規,這會導致重複的數據。

有沒有更好的方法來防止這種情況發生?或者我錯過了一些東西。

回答

3

由於與操作相關的潛在開銷,Vertica不會強制執行主鍵唯一性或對負載的唯一約束。

如果ANALYZE_CONSTRAINTS()在提交之前運行,您應該能夠捕獲潛在的重複項。還有開銷UPDATE s,應該避免。

有許多方法可以加載唯一性,例如使用MERGE或將數據暫存到臨時表中。每種方法都有其自身的侷限性。您可以閱讀更多關於在我的blog post中強制執行數據唯一性的信息。

更新:從7.2開始,Vertica可以自動實施主鍵和唯一鍵約束。有關更多信息,請參閱documentation

+0

只是爲了澄清,ANALYZE_CONSTRAINS()在它正確運行的事務範圍內運行?如果另一個並行事務正在執行,它們都不會「看到」它們彼此將違反約束? – 2014-09-24 18:18:05

+0

@phraktal它應該與交易隔離。 – Kermit 2014-09-24 18:37:38