主キーの存在に応じてデータを挿入または更新する必要がある 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;
}
このプロジェクトの他の開発者は、物事をシンプルに保ち、単純な SQL や準備されたクエリよりも Active Record コードを好むように私に依頼しました。どちらの場合も短所。
たとえば、アクティブ レコード ソリューションは、フロー制御の観点からは非常に単純ですが、パフォーマンスの面で大きな欠点があり、同時実行の問題が発生する可能性があるというさらに大きな欠点があります (最初のクエリで指定された条件が 2 番目のクエリの実行前に変更された場合)。クエリ、結果は予測できません)。
一方、正常にINSERT...ON DUPLICATE KEY UPDATE
動作し、同時実行の問題を回避しますが、MySQL のみであり、移植性の問題が発生する可能性があり、CI の Active Record では構築できないため、準備されたクエリが必要です。
この場合のベストプラクティスは何ですか?望ましい結果を達成するための他のより良い方法はありますか?