确定是创建了新的MySQL记录还是仅更新了?

时间:2015-03-28 22:38:41

标签: php mysql database

我在下面有这个PHP函数,如果一个具有相同ID的那个已经存在,则创建一个新的Project Task MySQL数据库记录。

如果已经存在具有相同ID的那个,那么它将成为UPDATES MySQL记录。

此代码投入了大量时间,因为只有在这5个字段中的任何一个已更改为a时,才会更新任务记录的date_modified字段非常重要。新价值!: - 姓名
- 说明
- 状态
- 类型
- 优先级

如果在制作UPDATE时所有这些字段都与上一个值具有相同的值,例如,如果sort_order值已更改,则更新date_modified字段!

经过大量工作以使其正常工作,它的效果非常好。我提到这一切因为不破坏这个功能很重要!

现在这个问题是因为这个函数在MySQL中可以CREATEUPDATE任务记录。

我现在需要知道每个事件发生的时间。

如果新的任务记录为CREATED,那么我需要知道已创建新记录。

如果任务记录只是UPDATED,那么我需要知道该记录已经存在且只是更新。

无论如何要确定我发生的事件中发生了哪两件事?

private function _addOrUpdateTaskRecord($taskId, $projectId, $created_by_user_id, $modified_user_id, $name, $description, $status, $priority, $type, $date_entered, $date_modified, $date_started, $date_completed, $date_due, $milestone_id, $assigned_user_id, $sort_order, $heading){

    $sql = "
        INSERT INTO
            $this->tasksDbTableName(task_id, project_id, created_by_user_id, modified_user_id, name, description, status, priority, type, date_entered, date_modified, date_started, date_completed, date_due, milestone_id, assigned_user_id, sort_order, heading)
        VALUES
            ('$taskId', '$projectId', '$created_by_user_id', '$modified_user_id', '$name', '$description', '$status', '$priority', '$type', UTC_TIMESTAMP(), UTC_TIMESTAMP(), '$date_started', '$date_completed', '$date_due', '$milestone_id', '$assigned_user_id', '$sort_order', '$heading')
        ON DUPLICATE KEY UPDATE
            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),
            modified_user_id='$modified_user_id',
            name='$name',
            description='$description',
            status='$status',
            priority='$priority',
            type='$type',
            date_started='$date_started',
            date_completed='$date_completed',
            date_due='$date_due',
            milestone_id='$milestone_id',
            assigned_user_id='$assigned_user_id',
            sort_order='$sort_order',
            heading='$heading'";

    $insertOrUpdateTasks = $this->db->query($sql);

     return $insertOrUpdateTasks;

}

更新

我在这里添加我的MySQL触发器代码供其他人查看,因为它可能会帮助有一天有类似问题的人,或者我自己,所以我不会发布一个问题我再次找到解决方案!

在创建任务时触发创建事件记录

DROP TRIGGER IF EXISTS project_task_new_event;
CREATE TRIGGER `project_task_new_event` AFTER INSERT ON `apoll_web_projects_tasks`
FOR EACH ROW
    INSERT INTO apoll_web_projects_events (event_type, project_id, task_id, created_by_user_id, description, date_created) VALUES ('6', NEW.project_id, NEW.task_id, NEW.modified_user_id, NEW.name, UTC_TIMESTAMP());

触发在任务更新时创建事件记录

DROP TRIGGER IF EXISTS project_task_update_event;
DELIMITER $$
CREATE TRIGGER `project_task_update_event` AFTER UPDATE ON `apoll_web_projects_tasks` FOR EACH ROW
BEGIN
IF NOT (NEW.date_modified <=> OLD.date_modified)
    THEN
        INSERT INTO apoll_web_projects_events (event_type, project_id, task_id, created_by_user_id, description, date_created) VALUES ('7', NEW.project_id, NEW.task_id, NEW.modified_user_id, NEW.name, UTC_TIMESTAMP());
    END IF;
END $$
DELIMITER ;

2 个答案:

答案 0 :(得分:2)

您可以使用db类中的affected_rows。 (我不确定究竟是哪个班级)。来自the manual

  

使用ON DUPLICATE KEY UPDATE,   每行的受影响行值为1   该行作为新行和2插入   如果现有行已更新。

答案 1 :(得分:1)

您的代码不安全。你有SQL注入问题。

要知道记录是否已创建或更新,请简单比较create_date!= update_date

插入数据时,请将create_date和update_date设置为相同的值。在&#34; ON DUPLICATE&#34;部分更新&#34; update_date&#34;字段。

另一种解决方案是使用触发器,如下所示:

DELIMITER $$

CREATE TRIGGER `update_trigger` BEFORE UPDATE ON `tasks_table` FOR EACH ROW 
    BEGIN
        /* Add any fields you want to compare here */
        IF !(OLD.name <=> NEW.name OR OLD.description <=> NEW.description OR OLD.description <=> NEW.description OR OLD.status <=> NEW.status OR OLD.type <=> NEW.type OR OLD.priority <=> NEW.priority) THEN
           NEW.date_modified = NOW()
        END IF;
    END;$$

DELIMITER ;