Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Apakah Anda hanya memperbarui bidang yang diubah atau semua bidang?

Saya pikir itu layak untuk diubah - tetapi mungkin tidak layak untuk melakukan pemilihan sebelum memasukkan.

Saya hanya memperbarui bidang yang telah berubah, itu bagian dari operasi kelas DbEntity saya yang mengikuti pola rekaman aktif. Biayanya sedikit ekstra untuk melakukan ini karena saya memegang catatan saat ini dan catatan asli - cukup menyalin setiap kali catatan dimuat.

Alasannya singkat - bukan kinerja. Anda juga dapat memeriksa modifikasi bersamaan dengan menambahkan klausa where pada nilai lama dari bidang yang diperbarui dan membuang kesalahan yang sesuai.

Dalam metode tulis/perbarui:

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

Dalam metode pemuatan

$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. Jauh Memiliki Banyak Melalui

  2. PHP PDO dengan foreach dan fetch

  3. Server mengirim charset (255) tidak diketahui oleh klien, tetapi set karakter cocok

  4. kesalahan fatal 'stdio.h' Python 2.7.3 di Mac OS X 10.7.5

  5. MySql memperbarui dua tabel sekaligus