添加或更新MySQL记录而不总是更新date_modified列

时间:2014-09-19 00:57:22

标签: php mysql sql

我在下面有这个功能,我用来将新记录插入MySQL或更新记录(如果它已经存在)。

它是我正在构建的项目管理项目的一部分,现在我已在字段中添加了任务排序顺序。所以基本上,如果一个项目有100个任务并且用户保存数据,那么它将进行100个SQL查询。我并不喜欢这个想法,但在这种情况下,我认为这样会很好。

有一件事让我烦恼,我有一个date_modified数据库列是DATETIME字段。理想情况下,我只想在任务名称,描述,状态,类型或优先级更改时更新此列。

我真的不确定这样做的最佳方法吗?有什么想法吗?

这就是我现在所拥有的......

public function addOrUpdateTaskRecord($taskId, $projectId, $name, $description, $status, $priority, $type, $date_entered, $date_modified, $sort_order, $heading){

    $sql = "
        INSERT INTO
            $this->tasksDbTableName(task_id, project_id, name, description, status, priority, type, date_entered, date_modified, sort_order, heading)
        VALUES
            ('$taskId', '$projectId', '$name', '$description', '$status', '$priority', '$type', UTC_TIMESTAMP(), UTC_TIMESTAMP(), '$sort_order', '$heading')
        ON DUPLICATE KEY UPDATE
            name='$name',
            description='$description',
            status='$status',
            priority='$priority',
            type='$type',
            date_modified=UTC_TIMESTAMP(),
            sort_order='$sort_order',
            heading='$heading'";

     return $this->db->query($sql);

}

1 个答案:

答案 0 :(得分:1)

我认为你可以在set子句中放置一个表达式,所以逻辑就在那里:

date_modified = (case when name <> values(name) or
                           description <> values(description) or
                           status <> values(status) or
                           type <> values(type) or
                           priority <> values(priority)
                      then UTC_TIMESTAMP()
                      else date_modified
                 end)