Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Bạn chỉ cập nhật các trường đã thay đổi hay tất cả các trường?

Tôi nghĩ điều đó đáng để thay đổi - nhưng có lẽ không đáng để thực hiện lựa chọn trước khi chèn.

Tôi chỉ cập nhật các trường đã thay đổi, đó là một phần của hoạt động của lớp DbEntity tuân theo một mẫu ghi hoạt động. Sẽ tốn thêm một ít chi phí để thực hiện việc này vì tôi giữ bản ghi hiện tại và bản ghi gốc - sao chép đơn giản bất cứ khi nào bản ghi được tải.

Lý do là sự ngắn gọn - không thực sự là hiệu suất. Ngoài ra, bạn có thể kiểm tra sửa đổi đồng thời bằng cách thêm mệnh đề where vào giá trị cũ của các trường được cập nhật và đưa ra lỗi thích hợp.

Trong phương thức ghi / cập nhật:

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

Trong phương thức tải

$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. Tính chênh lệch thời gian giữa 2 ngày bằng phút

  2. Làm thế nào để chèn dữ liệu hàng loạt vào cơ sở dữ liệu cùng một lúc?

  3. Làm cách nào để cộng hai kết quả đếm (*) trên hai bảng khác nhau?

  4. mysql SẮP XẾP THEO số lượng từ phù hợp duy nhất

  5. Sử dụng Order By trong codeigniter