2013-04-25 97 views
0

如何使用Squeryl插入不存在的條目?Squeryl:插入如果不存在?

我試圖捕捉一個PSQLException,如果插入語句在已經存在的元組上執行,但它不起作用(PSQLException沒有抓住)。實際上,最好告訴Squeryl不要插入已經存在的元組。這就是我正在尋找的東西。

回答

0

你不希望在數據庫中存在相同的元組,或者只有那個squeryl不會插入它們?

在第一種情況下,只需在該元組上添加一個唯一約束。示例:

on(myTable)(e => declare(
    columns(e.name, e.year) are (indexed("myIndex"), unique) 
)) 

此代碼將放置在表格定義附近,如val myTable = table[MyTable]。我也在這個元組上添加了一個索引,如果你願意,你可以放棄這個代碼。

+0

第一個由數據庫處理。它不允許一個元組存在多次。所以這不是我想要的。實際上,我只是需要Squeryl來避免不必要的插入,無論如何拋出一個異常(在拋出的PSQLException的情況下不是catchabale),數據庫會拒絕這個插入。 – ideaboxer 2013-04-25 19:40:15

2

不幸的是,如果您使用Postgres,如果發生異常,您將無法繼續處理。這裏有一個相當不錯的討論:https://groups.google.com/forum/?fromgroups=#!topic/squeryl/zaflXRra0qg

要做你正在尋找的,你可能會想先發出一個選擇找到ids已經存在,並將它們從你正在尋找的項目中刪除插。

+0

我可以在原子操作中選擇並插入嗎? – ideaboxer 2013-04-25 19:35:06

+1

不是我能想到的,但是您可能會開始一個事務,然後抓住原始jdbc會話發出表鎖,然後執行您的命令。不是超高效的,但會是原子的。 – jcern 2013-04-25 19:48:55

+0

謝謝。這聽起來很複雜...... – ideaboxer 2013-04-25 20:08:48