我有一个 SQL 表,我必须根据主键的存在来插入或更新数据。上下文是在 MySQL 上运行的基于 CodeIgniter 的 PHP Web 应用程序。我发现了INSERT...ON DUPLICATE KEY UPDATE
完全符合我需要的语句,但在此之前,代码是基于 CI 的 Active Record 实现的,看起来像这样:
$res = $this->db->get_where('table', array('id' => $this->_id));
if(count($res->result_array()) > 0) { // update if present
$this->db->where(array('id' => $this->_id));
$this->db->update('table', $hash);
return 2;
} else { // new entry if not present
$personal_data['id'] = $this->_id;
$this->db->insert('table', $hash);
return 1;
}
该项目中的其他开发人员要求我保持简单,并且更喜欢 Active Record 代码而不是直接 SQL 和准备好的查询,经过一段时间的思考,我不确定什么最适合这种情况,因为有优点和在这两种情况下都有缺点。
例如,从流控制的角度来看,Active Record 解决方案非常简单,但性能上有很大的缺点,并且潜在的并发问题更大的缺点(如果第一个查询声明的条件在第二个查询执行之前发生了变化)查询,结果是不可预测的)。
另一方面,INSERT...ON DUPLICATE KEY UPDATE
工作正常并避免了并发问题,但仅适用于 MySQL,可能导致可移植性问题,而且不能使用 CI 的 Active Record 构造,我需要一个准备好的查询。
在这种情况下,最佳做法是什么?还有其他更好的方法来实现预期的结果吗?