Myslím, že to stojí za změnu - ale pravděpodobně nestojí za to dělat výběr před vložením.
Aktualizuji pouze pole, která se změnila, je to součást operace mé třídy DbEntity, která se řídí vzorem activerecord. Stojí to jen málo navíc, protože mám aktuální záznam a původní záznamy – jednoduše zkopíruji, kdykoli je záznam načten.
Důvodem je stručnost – ne skutečně výkon. Můžete také zkontrolovat souběžné úpravy přidáním klauzule where na starou hodnotu aktualizovaných polí a vyvoláním příslušné chyby.
V metodě zápisu/aktualizace:
$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);
V metodě zatížení
$this->orig_record = Array();
foreach ($this->record as $key => $value)
$this->orig_record[$key] = $value;