Mysql
 sql >> Base de données >  >> RDS >> Mysql

Mettez-vous à jour uniquement les champs modifiés ou tous les champs ?

Je pense que cela vaut la peine de changer - mais probablement pas la peine de faire une sélection avant l'insertion.

Je ne mets à jour que les champs qui ont changé, cela fait partie du fonctionnement de ma classe DbEntity qui suit un modèle activerecord. Cela ne coûte que peu de frais supplémentaires car je détiens l'enregistrement actuel et les enregistrements originaux - en copiant simplement chaque fois qu'un enregistrement est chargé.

Les raisons sont la brièveté - pas vraiment la performance. Vous pouvez également vérifier les modifications simultanées en ajoutant une clause where sur l'ancienne valeur des champs mis à jour et générer l'erreur appropriée.

Dans la méthode écriture/mise à jour :

$s1 = "";

foreach ($this->record as $key => $value)
{
    // only update fields that have been changed
    if ($value != $this->orig_record[$key])
    {
        $s1 .= $comma."`$key`='".mysql_real_escape_string($value)."'";
        $comma = ", ";
    }
}

$query = "UPDATE ".$this->table." SET $s1 where {$this->id_field}='".$this->get_keyfield()."'";
$query .= $this->extra_sql_update;
mysql_query($query);

$ar = mysql_affected_rows();
//
// the number of affected rows is actually those changed by the update operation, which will 
// either be zero, or 1. If the query affects more than one row then we have a problem.
if ($ar < 0 || $ar > 1)
{
    cbf_error("cbf_dbentity: {$this->table} :: only one row (not $ar) must be affected by an insert operation. $query",
      E_USER_ERROR);
}
else
{
    $new_id = $this->get_keyfield();

    GlobalEventBus::notify_all(new AuditLogSQL($this->table, "update", $query));

}

$this->orig_record = Array();

foreach ($this->record as $key => $value)
    $this->orig_record[$key] = $value;


//
// sanity check - ensure that what we have just written is actually there.

$this->load($new_id);

foreach ($this->orig_record as $key => $value)
    if (trim($this->record[$key]) != trim($value) 
        && (!$this->record[$key] == "0" && $value=""))
        cbf_error("cbf_dbentity: {$this->table} :: record differs during write after reload: field $key was \"$value\", after write it is now \"".
              $this->record[$key]."\"",E_USER_ERROR);

Dans la méthode de chargement

$this->orig_record = Array();
foreach ($this->record as $key => $value)
    $this->orig_record[$key] = $value;