seq列を更新するためにこのトリガーを作成しました。テーブル内の特定のアイテムの順序を追跡する必要がありますが、liability_category_id=1,2の場合に限ります。したがって、liability_category_id = 3のアイテムは追跡する必要がないため、注文には注意が必要です。
私のトリガーでは、最後に入力されたseq番号を(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ごとに順序がリセットされます。