對不起,如果標題錯過了,我不能想出一個更好的與我的問題有關的問題。MySQL觸發器通過重新排序其值來更新列
我一直在試圖解決這一段時間,我找不到解決方案。
我有一個表categories
:
+----+--------+----------+
| ID | Name | Position |
+----+--------+----------+
| 1 | Dogs | 4 |
| 2 | Cats | 3 |
| 3 | Birds | 10 |
| 4 | Others | 2 |
+----+--------+----------+
我需要保持排名列,以便在某種程度上不會錯過的價值觀一樣,所以最終的表應該是這樣的:
+----+--------+----------+
| ID | Name | Position |
+----+--------+----------+
| 1 | Dogs | 3 |
| 2 | Cats | 2 |
| 3 | Birds | 4 |
| 4 | Others | 1 |
+----+--------+----------+
我試過的是在UPDATE和INSERT上創建一個觸發器來試圖防止這種情況。我創建的觸發器(與INSERT相同):
DELIMITER //
CREATE TRIGGER sortPostions BEFORE UPDATE ON categories
FOR EACH ROW BEGIN
SET @max_pos = 0;
SET @min_pos = 0;
SET @max_ID = 0;
SET @min_ID = 0;
SELECT position, id INTO @max_pos,@max_ID FROM categories WHERE position = (SELECT MAX(position) FROM categories);
SELECT position, id INTO @min_pos,@min_ID FROM categories WHERE position = (SELECT MIN(position) FROM categories);
IF NEW.position >= @max_pos AND NEW.id != @max_ID THEN
SET NEW.position = @max_pos + 1;
END IF;
IF NEW.position <= @min_pos AND NEW.id != @min_ID THEN
SET NEW.position = @min_pos - 1;
END IF;
IF NEW.position < 0 THEN
SET NEW.position = 0;
END IF;
END//
DELIMITER ;
但不幸的是,它不能按預期工作。這不是修復缺失值,我認爲這不是一個完美的解決方案。
我繼續和創建的過程:
BEGIN
SET @n = 0;
UPDATE categories
SET position = @n:[email protected]+1
ORDER BY position ASC;
END
但我無法從觸發器調用這個過程,因爲它似乎是,MySQL不允許。我得到以下錯誤:
#1442 - Can't update table 'categories' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
的mysql -V輸出:
mysql Ver 14.14 Distrib 5.5.57, for debian-linux-gnu (x86_64) using readline 6.3
什麼是解決這個問題的完美解決方案? 非常感謝!
我不知道在調用存儲過程從觸發器的MySQL限制。 –
@GordonLinoff我收到以下錯誤:#1442 - 無法更新存儲的函數/觸發器中的表'類別',因爲它已被調用此存儲的函數/觸發器的語句使用。 – Lambasoft
@GordonLinoff我認爲這是因爲觸發器/過程進入一個無限循環,程序再次觸發觸發器。 – Lambasoft