Mysql
 sql >> база данни >  >> RDS >> Mysql

Актуализирате ли само променените полета или всички полета?

Мисля, че си струва да се промени - но вероятно не си струва да правите избор преди вмъкване.

Актуализирам само полетата, които са се променили, това е част от операцията на моя клас DbEntity, който следва модел на активен запис. Това струва малко повече, защото държа текущия запис и оригиналните записи - просто копирам всеки път, когато се зареди запис.

Причините са краткост - не всъщност ефективност. Също така можете да проверите за едновременна модификация, като добавите клауза where към старата стойност на актуализираните полета и изведете съответната грешка.

В метода за запис/актуализация:

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

В метода на натоварване

$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. Как да поддържам връзката жива в java

  2. Как да генерирам данни в MySQL?

  3. Инструмент за оптимизиране на Mysql

  4. Разбъркайте таблица в MySQL със съхранена процедура

  5. Как да конвертирате 500GB SQL таблица в Apache Parquet?