Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Czy aktualizujesz tylko zmienione pola czy wszystkie pola?

Myślę, że warto to zmienić - ale prawdopodobnie nie warto robić wyboru przed wstawieniem.

Aktualizuję tylko te pola, które uległy zmianie, jest to część operacji mojej klasy DbEntity, która jest zgodna ze wzorcem activerecord. Kosztuje to niewiele więcej, ponieważ trzymam bieżący rekord i oryginalne rekordy - po prostu kopiuję za każdym razem, gdy rekord jest ładowany.

Powodem jest zwięzłość, a nie wydajność. Możesz również sprawdzić współbieżną modyfikację, dodając klauzulę where do starej wartości zaktualizowanych pól i zgłaszając odpowiedni błąd.

W metodzie zapisu/aktualizacji:

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

W metodzie ładowania

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak kontrolujemy dynamiczne porządkowanie według pola w tabeli?

  2. Jak uzyskać dostęp do MySQL za pomocą głównego użytkownika MySQL?

  3. Hasło sklepu jest w porządku w zmiennej sesji php?

  4. PHP Odwróć kolejność wyników w MySQL DB

  5. utf8_bin kontra utf_unicode_ci