【发布时间】:2012-11-26 13:34:15
【问题描述】:
我有一个 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 构造,我需要一个准备好的查询。
在这种情况下,最佳做法是什么?还有其他更好的方法可以达到预期的效果吗?
【问题讨论】:
标签: mysql codeigniter activerecord