2014-10-01 103 views
0

我在下面的MySQL SQL中运行我的项目管理应用程序,我每次保存项目任务时都会建立这个应用程序。仅当另一个表上的列被更新或新记录添加到另一个表时,才将记录插入到新的MySQL数据库表中?

保存可以包含保存新任务记录以及更新现有记录。因为这个原因,我有这个花哨的SQL下面插入一个新的任务记录,如果它不存在与该ID,如果它已经存在,然后它更新某些领域。它很聪明,它不会更新date_modified列,除非name,description,status,type,priority字段已经从他们以前的值改变。原因是因为如果只更新sort_order列,sort_order列将在每个记录更新时更改,但不应构成date_modified字段中的“更改”。

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

到目前为止,它的效果非常好,就像我希望的那样,但现在我面临另一个挑战。

我想创建一个新的数据库表更新这将基本上插入一个新的记录,每次添加一个新的任务记录和每次任务记录被更新时。

一个例子是当我用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数据库表,或者在任务记录有这些栏目的更新:namedescriptionstatustypepriority,或date_modified已更新。这意味着,如果任务记录只更新像sort_order这样的字段,那么它不会将新记录插入到更新的任务记录的UPDATES表中。

我在StackOverflow上看到了一些有点类似的帖子,但仍然不太复杂,使用TRIGGERS,我从来没有使用触发器,甚至直到最近才听说过它们,所以我不知道如果这是我将如何做到这一点,如果是这样,我将如何使它在我的新UPDATES表中执行如此复杂的条件插入。

我的最终目标是简单地创建一个新的UPDATES表,它将充当显示哪些任务被创建和修改以及由哪个用户和DATETIME事件发生的流。使它复杂化的是我现有的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); 

回答

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 ; 
相关问题