2014-05-08 36 views
3

在我嘗試向PostgreSQL表中插入行之前,我應該查詢插入是否會違反約束?PostgreSQL:確定允許錯誤?

我會檢查插入時是否會在出現錯誤時導致不需要的副作用(例如,自動遞增)。

但是,如果不存在任何可能的副作用,可以盲目嘗試插入到表中嗎?或者,在可能的情況下通過預測錯誤來防止錯誤是更好的做法(正如Objective-C所建議的那樣)?

另外,在SQL函數中執行插入操作時,如果插入操作失敗,函數內部的其他查詢(例如CTE)會回滾到哪裏?

回答

3

一般來說,手工測試並不是一個好主意,因爲它要求您顯式鎖定表以防止其他客戶端在您的測試和插入之間更改或插入數據。顯式鎖定對於併發是不利的。

由於插入失敗而自動遞增的序列通常不是問題。只是不要認爲插入數據庫的值是連續的。

數據庫和obj-c是兩個完全不同的東西。讓數據庫檢查問題,向模式添加適當的約束要容易得多,然後檢查客戶端程序中的所有內容。

缺省值是回滾到事務的開始。但是你可以用保存點控制它並回滾到保存點。但是,CTE是查詢的一部分,並且當部分查詢失敗時,查詢總是完全回滾。但是,您可以通過將CTE拆分爲創建臨時表的完整查詢來解決此問題。然後你可以使用臨時表而不是cte。