sql >> データベース >  >> RDS >> Mysql

変更されたフィールドのみを更新しますか、それともすべてのフィールドを更新しますか?

    変更する価値はあると思いますが、挿入する前に選択を行う価値はないでしょう。

    変更されたフィールドのみを更新します。これは、activerecordパターンに従う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. SQL Server(T-SQL)のパスワードが間違っているためにログインに失敗した回数を取得する

    2. データ型xmltypeの列でora_hashを使用する方法

    3. SQL2005のPIVOT

    4. SQL SELECTは最初のN個の結果をスキップしますか?