繁体   English   中英

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

[英]Determine if a New MySQL record was created or instead just updated?

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

如果已经存在具有相同ID的ID,则改为UPDATES MySQL记录。

此代码投入了大量时间,因为仅当这5个字段中的任何一个都更改为新值date_modified更新Task记录的date_modified字段非常重要!:
- 名称
-说明
- 状态
-类型
- 优先

如果所有这些字段在进行UPDATE时都具有与先前值相同的值,例如,如果sort_order值已更改,则它将不会更新date_modified字段!

经过大量工作精心制作,使其工作正常。 我提到所有这些,因为不要破坏此功能很重要!

现在的问题是因为此函数可以在MySQL中CREATEUPDATE Task记录。

我现在需要知道这些事件中的每一个何时发生。

如果一个新的任务记录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 ;

您可以从您的数据库类中使用受影响的行。 (我不确定那是什么课)。 手册

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

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

要知道记录是创建还是更新的,只需比较create_date!= update_date

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

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

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 ;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM