仅当另一个表上的列被更新或新记录添加到另一个表时,才将记录插入新的MySQL数据库表中?

时间:2014-10-01 22:21:18

标签: php mysql sql

我在下面的MySQL SQL中运行了我每次保存项目任务时都要构建的Project Management应用程序。

保存可以包括保存新任务记录以及更新现有记录。出于这个原因,我在下面有这个花哨的SQL,如果它还没有存在该ID,则插入一个新任务记录,如果它已经存在则会更新某些字段。它足够智能,除非date_modifiednamedescriptionstatustype字段已更改,否则不会更新priority列他们以前的价值。这是因为sort_order列会在每次更新记录时发生更改,但不应构成" 更改"如果仅更新date_modified列,则在sort_order字段中。

它以这种方式工作的原因是因为页面上有1个表单,用于加载项目的所有Tasks记录,因此您可以一次批量编辑所有记录,也可以在底部添加新的Tasks记录。因此,下面的SQL将在WHILE循环中为每个正在保存的任务记录调用。

到目前为止它的效果令人惊讶,正如我所希望的那样,但现在我正处于另一个挑战中。

我想为更新创建一个新的数据库表,基本上每次添加新任务记录时以及每次更新任务记录时都会插入一条新记录。

例如,当我使用20个Project Tasks更新页面并更改5个Tasks记录的值时,它会在我的更新表中插入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中知道哪些记录实际已更新,因为它更新了每条记录,我需要插入到我的新表中,只记录{{1}已更新。


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

我在StackOverflow上看到一些帖子有些相似,但使用sort_order的复杂项目远不那么复杂,我从未使用过触发器,甚至直到最近才听说过它们所以我不知道我是怎么回事我必须这样做,如果是的话,我将如何让它在我的新UPDATES表中进行如此复杂的条件插入。

我的最终目标是简单地创建一个新的UPDATES表,它将作为一个流显示创建和修改哪些任务,以及由哪个用户和事件发生的DATETIME。使其复杂化的是我现在的INSERT或UPDATE SQL必须继续工作它现在的工作方式,但不知何故得到相应于上述条件更新的正确任务,以构成新的UPDATES表中的新插入记录。请高手帮忙!?


TRIGGERS

1 个答案:

答案 0 :(得分:0)

我开始尝试触发器,他们似乎是我的门票,他们正在努力并实现我的最终目标!

对于任务INSERTS我有这个触发器......

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 ;