2012-08-28 52 views
2

我想更新記錄,如果記錄存在或插入一個新的,如果不存在。檢查存在或發現異常?

什麼是最好的方法?

做一個Select Count()如果返回零然後插入,如果有人然後查詢記錄,修改和更新,或者我應該只是試圖查詢記錄和捕獲任何system.queryexception?

這一切都在Apex中完成,而不是從REST或JS API完成。

+0

upsert有什麼問題? –

回答

2

加入已經在這裏說過的內容,您想在這些情況下使用FOR UPDATE來避免superfell指的是什麼。所以,

Account theAccount; 
Account[] accounts = [SELECT Id FROM Account WHERE Name = 'TEST' LIMIT 1 FOR UPDATE]; 
if(accounts.size() == 1) 
    theAccount = accounts[0]; 
else 
    theAccount = new Account(); 

// Make modifications to theAccount, which is either: 
// 1. A record-locked account that was selected OR 
// 2. A new account that was just created with new Account() 

upsert theAccount; 
+0

在帳戶不存在的情況下,這不起作用,因爲沒有要鎖定的帳戶行。您需要鎖定兩種情況下存在的父行,或者使用依賴基礎數據庫索引的upsert來執行正確的操作。 – superfell

+0

??你確定嗎?如果你看我的代碼,我先創建一個新帳戶。如果其中一個不存在,那麼新帳戶就是使用(插入)的帳戶,但是如果帳戶存在,則會爲帳戶get分配值並執行更新。也許我的代碼會更清晰,如果我改變它。現在改變它... – Adam

+0

是的,我確定,你修改後的代碼使用upsert,因此可以跳過選擇開始。 – superfell

0

我會用一個列表和isEmpty()功能試試吧:

List<Account> a = [select id from account where name = 'blaahhhh' Limit 1]; 

if(a.isEmpty()){ 
    System.debug('#### do insert'); 
} 
else{ 
    System.debug('#### do update'); 
} 
+0

好主意。這種方法的任何理由? –

1

您應該使用upsert呼叫如果在所有可能的選擇,然後插入/更新的方法是有問題的,一旦你進入的同時境界除非你正確地鎖定父行作爲選擇呼叫的一部分。