Salesforce 检查是否存在或捕获异常?

Salesforce 检查是否存在或捕获异常?,salesforce,apex-code,soql,Salesforce,Apex Code,Soql,如果记录存在,我想更新记录;如果不存在,我想插入新记录 最好的方法是什么 执行Select计数,如果返回零,则插入,如果返回零,则查询记录、修改和更新, 或者我应该尝试查询记录并捕获任何system.queryexception吗 这一切都是在Apex中完成的,而不是从REST或JS API中完成的。我会尝试使用列表和isEmpty函数: 列表a=[从帐户中选择id,其中名称='blaahhh'限制1]; 我是空的{ 调试“do insert”; } 否则{ 调试'do update'; } 我

如果记录存在,我想更新记录;如果不存在,我想插入新记录

最好的方法是什么

执行Select计数,如果返回零,则插入,如果返回零,则查询记录、修改和更新, 或者我应该尝试查询记录并捕获任何system.queryexception吗


这一切都是在Apex中完成的,而不是从REST或JS API中完成的。

我会尝试使用列表和isEmpty函数:

列表a=[从帐户中选择id,其中名称='blaahhh'限制1]; 我是空的{ 调试“do insert”; } 否则{ 调试'do update'; }
我会尝试使用列表和isEmpty函数:

列表a=[从帐户中选择id,其中名称='blaahhh'限制1]; 我是空的{ 调试“do insert”; } 否则{ 调试'do update'; }
如果可能,您应该使用该调用。一旦进入并发调用领域,选择然后插入/更新方法就会出现问题,除非您在选择调用中正确锁定父行。

如果可能,您应该使用该调用,一旦进入并发调用领域,选择然后插入/更新方法就会出现问题,除非您在选择调用中正确锁定父行。

除了这里已经说过的内容之外,您希望在这些情况下使用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;

除了这里已经说过的,在这些情况下,您希望使用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;

好主意。有什么理由这么做吗?好主意。这种方法有什么原因吗?upsert有什么问题?upsert有什么问题?在帐户不存在的情况下,这不起作用,因为没有要锁定的帐户行。您需要锁定在这两种情况下都存在的父行,或者使用依赖于基础数据库索引的upsert来执行正确的操作。??你确定吗?如果你看一下我的代码,我会先创建一个新帐户。如果一个帐户不存在,则新帐户是用于插入的帐户,但如果一个帐户确实存在,则将为account get赋值并执行更新。如果我对代码进行更改,可能代码会更清晰。现在更改它…是的,我确定,您修改的代码使用upsert,因此可以跳过select开始。我想我明白您的意思了。我个人避免在可能的情况下进行计数和选择,因为它会烧掉2个SOQL调用,而不是一个。我修改后的代码实际上和我以前的代码做的一样——我只是将新帐户实例化移到else块,而不是在上面执行。也许看起来更清楚,但之前就有这样的情况。通常,如果要更新对象(包括upsert)中已存在的任何内容,则需要首先选择它。使用FOR UPDATE执行此操作是一种例外做法,除非我遗漏了一些内容。如果您正在执行更新,并且知道新值,则绝对不需要首先读取该行。如果新值取决于当前值,则应使用“是”读取行以进行更新。在帐户不存在的情况下,这不起作用,因为没有要锁定的帐户行。您需要锁定在这两种情况下都存在的父行,或者使用依赖于基础数据库索引的upsert来执行正确的操作。??你确定吗?如果你看一下我的代码,我会先创建一个新帐户。如果一个帐户不存在,则新帐户是用于插入的帐户,但如果一个帐户确实存在,则将为account get赋值并执行更新。如果我对代码进行更改,可能代码会更清晰。现在更改它…是的,我确定,您修改的代码使用upsert,因此可以跳过select开始。我想我明白您的意思了。我个人避免在可能的情况下进行计数和选择,因为它会烧掉2个SOQL调用,而不是一个。我修改后的代码实际上和我以前的代码做的一样——我只是将新帐户实例化移到else块,而不是在上面执行。也许看起来更清楚,但之前就有这样的情况。通常,如果要更新对象(包括upsert)中已存在的任何内容,则需要首先选择它。使用FOR UPDATE执行此操作是一种例外做法,除非我遗漏了一些内容。如果您正在执行更新,并且知道新值,则绝对不需要首先读取该行。如果新值取决于当前值,则应使用“是”读取行以进行更新。