【问题标题】:Insert record into new MySQL Database table only when a Column on another Table is Updated or a New record is added to that other Table?仅当更新另一个表上的列或将新记录添加到另一个表时才将记录插入新的 MySQL 数据库表?
【发布时间】:2014-10-02 08:59:43
【问题描述】:

每次保存项目任务时,我都会在我正在构建的项目管理应用程序上运行下面的 MySQL SQL。

保存可以包括保存新任务记录以及更新现有记录。出于这个原因,我在下面有一个花哨的 SQL,如果该 ID 尚不存在,则插入一个新任务记录,如果它已经存在,则它会更新某些字段。它很聪明,它不会更新 date_modified 列,除非 namedescriptionstatustypepriority 字段已从以前的值更改。这是因为sort_order 列会在每次记录更新时发生变化,但如果只更新sort_order 列,则不应构成date_modified 字段中的“change”。

之所以这样工作,是因为页面上有一个表单可以加载项目的所有任务记录,因此您可以一次批量编辑所有记录以及在底部添加新的任务记录。所以下面的这条 SQL 会在 WHILE 循环中为每条保存的 Tasks 记录调用。

到目前为止效果惊人,正如我所希望的,但现在我面临另一个挑战。

我想为 Updates 创建一个新的数据库表,它基本上会在每次添加 NEW Tasks 记录和每次更新 Task 记录时插入一条新记录。

例如,当我用 20 个项目任务更新一个页面并更改 5 个任务记录的值时,它会在我的更新表中插入 5 个新记录。有点像……

JasonDavis Updated Task Record #1
JasonDavis Updated Task Record #2
JasonDavis Updated Task Record #3
JasonDavis Updated Task Record #4
JasonDavis Updated Task Record #5
JasonDavis ADDED NEW Task Record #4534

由于我的 SQL 在下面运行的方式,我无法在我的 PHP 中知道哪些记录实际上已更新,因为它更新了每条记录,我需要插入到我的新表中,只有 date_modified 是的记录已更新。


问题 1):有人知道我如何实现这个目标吗?修改下面的 SQL 或其他方法以确保在创建新任务记录时将新记录插入到 UPDATES 数据库表中,或者当任务记录具有这些列中的任何更新时:namedescriptionstatustypeprioritydate_modified 已更新。这意味着如果一个任务记录只更新一个像sort_order 这样的字段,那么它不会为该更新的任务记录插入一条新记录到 UPDATES 表中。

我在 StackOverflow 上看到了一些帖子,它们使用 TRIGGERS 做一些类似但仍然远没有那么复杂的项目这样做,如果是,我将如何让它在我的新 UPDATES 表中执行如此复杂的条件插入。

我的最终目标是简单地创建一个新的 UPDATES 表,该表将充当一个流,显示创建和修改了哪些任务以及由哪个用户和事件发生的日期时间。使它复杂化的是我现有的 INSERT 或 UPDATE SQL 必须继续按照现在的方式工作,但以某种方式获得根据上述条件更新的正确任务,以构成新的插入记录到新的 UPDATES 表中。请高手帮忙!?


$sql = "
    INSERT INTO
        project_tasks(task_id, project_id, created_by_user_id, modified_user_id, name, description, status, priority, type, date_entered, date_modified, date_started, date_completed, 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', '$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',
        sort_order='$sort_order',
        heading='$heading'";

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

【问题讨论】:

    标签: php mysql sql


    【解决方案1】:

    我开始尝试触发器,它们似乎是我的票,它们正在工作并实现我的最终目标!

    对于任务插入,我有这个触发器...

    DROP TRIGGER IF EXISTS project_task_new_stream;
    CREATE TRIGGER `project_task_new_stream` AFTER INSERT ON `apoll_web_projects_tasks`
    FOR EACH ROW
        INSERT INTO apoll_web_projects_updates_stream (event_type, record_id, modified_user_id, record_name, description, date_entered) VALUES ('0', NEW.task_id, NEW.modified_user_id, NEW.name, NEW.description, NEW.date_modified);
    

    对于任务更新,我有这个触发器...它只会在 date_modified 字段发生更改时创建更新流记录!

    DROP TRIGGER IF EXISTS project_task_updates_stream;
    DELIMITER $$
    CREATE TRIGGER `project_task_updates_stream` 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_updates_stream (event_type, record_id, modified_user_id, record_name, description, date_entered) VALUES ('0', NEW.task_id, NEW.modified_user_id, NEW.name, NEW.description, NEW.date_modified);
        END IF;
    END $$
    DELIMITER ;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 2022-12-06
      • 2017-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多