我已創建此觸發器來更新seq列。我必須跟蹤表中某些項目的順序,但只有在liability_category_id = 1,2時纔有效。所以我的訂單很棘手,因爲任何帶有liability_category_id = 3的項目我都不需要跟蹤。創建觸發器以更新排序/排序列
在了扳機,我查詢找到最後輸入的序列號(使用MAX(SEQ)),然後轉身和更新與SEQ + 1
DELIMITER $$
USE `analysisdb`$$
DROP TRIGGER /*!50032 IF EXISTS */ `trigger_liability_detail_after_insert`$$
CREATE
/*!50017 DEFINER = 'admin'@'%' */
TRIGGER `trigger_liability_detail_after_insert` AFTER INSERT ON `liability_detail`
FOR EACH ROW BEGIN
DECLARE SortOrder INT;
IF NEW.liability_category_id = 1 OR NEW.liability_category_id = 2 THEN
SET SortOrder = (SELECT MAX(seq) FROM liability_detail WHERE analysis_id = new.analysis_id AND liability_category_id IN (1, 2));
UPDATE liability_detail SET seq = (SortOrder + 1) WHERE id = NEW.id;
END IF;
END;
$$
DELIMITER ;
新條目然而,當輸入一個新的項目時,我得到這個錯誤:無法更新存儲的函數/觸發器中的表'liability_detail',因爲它已經被調用此存儲的函數/觸發器的語句使用。
有沒有更好的方法來控制這些項目的順序?我最初的想法是簡單地設置第一個seq = 1,然後seq = 2等等。但是,對於每個新的analysis_id,排序都會重置。
以這種方式更新列可能會導致具有相同seq值的多個行,因爲最大值可能在插入期間讀取,但在另一個插入期間再次讀取之前未更新。你應該使用自動增量來處理這個問題。 – 2012-07-16 17:23:42