sql >> Base de Datos >  >> RDS >> Mysql

¿Actualiza solo los campos modificados o todos los campos?

Creo que vale la pena cambiarlo, pero probablemente no valga la pena hacer una selección antes de insertar.

Solo actualizo los campos que han cambiado, es parte del funcionamiento de mi clase DbEntity que sigue un patrón de registro activo. Cuesta un poco más hacer esto porque tengo el registro actual y los registros originales, simplemente copiando cada vez que se carga un registro.

Las razones son la brevedad, no realmente el rendimiento. También puede verificar la modificación simultánea agregando una cláusula where en el valor anterior de los campos actualizados y arrojar el error apropiado.

En el método de escritura/actualización:

$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);

En el método de carga

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