2014-10-01 107 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 ; 
相關問題