回答
通過使用關鍵字OLD
和NEW
,可以在更新之前和更新MySQL之後訪問列的值。
例如,如果你想確定是否列的值實際上已經改變時更新,你可以做
IF NOT OLD.column_name <=> NEW.column_name THEN
-- do something here
END IF;
注:<=>
是NULL安全的比較操作在MySQL
BTW: MySQL中沒有UPDATED
虛擬表。它來自SQL Server。
這裏是一個SQLFiddle演示。 請注意,儘管更新會影響表中的所有記錄,但log
表中只記錄了一條消息。這是因爲最終id爲2的行的價值保持不變。
UPDATE:,讓您的finished
標誌同步,你需要對所有的事件(插入,更新,刪除)的觸發器。
DELIMITER //
CREATE TRIGGER tg_ai_event
AFTER INSERT ON event
FOR EACH ROW
BEGIN
UPDATE activity a
SET status = (EXISTS(SELECT *
FROM event
WHERE activity = a.activity_id
AND done = 0))
WHERE activity_id = NEW.activity;
END//
CREATE TRIGGER tg_ad_event
AFTER DELETE ON event
FOR EACH ROW
BEGIN
UPDATE activity a
SET status = (EXISTS(SELECT *
FROM event
WHERE activity = a.activity_id
AND done = 0))
WHERE activity_id = OLD.activity;
END//
CREATE TRIGGER tg_au_event
AFTER UPDATE ON event
FOR EACH ROW
BEGIN
IF NOT OLD.activity <=> NEW.activity THEN
-- if activity id was changed for an event then clculate finished flag
-- for both old and new activity id
UPDATE activity a
SET status = (EXISTS(SELECT *
FROM event
WHERE activity = a.activity_id
AND done = 0))
WHERE activity_id IN(OLD.activity, NEW.activity);
ELSE
-- otherwise calculate finished flag only if done flag is changed
IF NOT OLD.done <=> NEW.done THEN
UPDATE activity a
SET status = (EXISTS(SELECT *
FROM event
WHERE activity = a.activity_id
AND done = 0))
WHERE activity_id = NEW.activity;
END IF;
END IF;
END//
DELIMITER ;
這裏是SQLFiddle演示
謝謝,你能告訴我爲什麼我在MySQL中遇到這個錯誤: 以下查詢失敗了:「CREATE DEFINER ='administ' @'localhost' TRIGGER'on_event_update' AFTER UPDATE ON'event' FOR EACH ROW IF NOT(SELECT * FROM event WHERE event.activity = OLD.activity AND event.done = 0)THEN UPDATE activity SET activity.status = 0 WHERE activity.activity_id = OLD.activity END IF;「 MySQL說:#1064 - 你的SQL語法有錯誤;檢查與您的MySQL服務器版本對應的手冊,在第3行'END IF'附近使用正確的語法 – user2703038
這是因爲您沒有使用'BEGIN ... END'塊,您應該這樣做,因爲您的觸發器的主體包含多於一個聲明。 – peterm
如果你解釋一下你想用觸發器強制執行的邏輯,我可以幫你解決這個問題。 – peterm
- 1. 觸發器計算的屬性更新
- 2. Magento更新產品屬性,無需觸發重新索引
- 3. 觸發與KVO屬性更新
- 4. MVVM viewmodel屬性觸發更新
- 5. RavenDB更新索引的觸發器
- 6. Ember.js:觸發'Ember.computed.filter'來更新控制器中屬性更改時
- 7. 使用屬性觸發器更改已具有綁定屬性
- 8. WPF觸發器更改父項屬性
- 9. 附加屬性來更新事件的樣式觸發器
- 10. 從INSERT觸發器更新時觸發更新後未觸發
- 11. 更新使用觸發器
- 12. 使用更新觸發器
- 13. 爲什麼changeDetectionStrategy.OnPush在@Input屬性更改中沒有更新,但更新了@Output觸發器屬性更改?
- 14. WPF在父對象的屬性更改時調用更新源觸發器xaml
- 15. 更新後在更新後的性能問題觸發器
- 16. 更新值的觸發器
- 17. 如何在子屬性更改時觸發NgComponent的更新
- 18. 更新觸發器上的Mysql更新
- 19. 更新觸發器是否更新其自己的表,調用觸發器?
- 20. 更新面板觸發器未觸發
- 21. INSERT觸發器沒有觸發更新?
- 22. 用於屬性更改的XAML WPF樣式觸發器
- 23. 使用控制器屬性觸發的事件後視圖不更新
- 24. javascript:使用ajax更改onClick屬性不會觸發新事件?
- 25. 在觸發器中引用更新的表名
- 26. Informix中插入觸發器的自我引用更新
- 27. 更新字段按觸發器更新
- 28. T-SQL觸發器更新
- 29. 觸發器不更新
- 30. 觸發器更新表
你在當前狀態下的問題是非常不清楚。你能詳細說明你想要達到的目標嗎? – peterm
您的意思是:在列A更新時(對於每個更新的行),獲取列B的值? – bd33
@ bd33我知道我可以使用UPDATED.attribute_name訪問更新的屬性。但是如果該屬性在查詢中沒有更新呢?我想知道更新行的該屬性的值。謝謝! – user2703038