50 lines
1.7 KiB
MySQL
50 lines
1.7 KiB
MySQL
|
|
-- Migration: Add position field to tasks table for subtasks ordering
|
||
|
|
-- Date: 2026-02-02
|
||
|
|
--
|
||
|
|
-- This migration adds position field to tasks table to allow
|
||
|
|
-- custom ordering of subtasks. The field is NULL for regular tasks
|
||
|
|
-- and contains position number for subtasks (tasks with parent_task_id).
|
||
|
|
|
||
|
|
-- Добавляем поле position
|
||
|
|
ALTER TABLE tasks
|
||
|
|
ADD COLUMN position INTEGER;
|
||
|
|
|
||
|
|
-- Заполняем позиции для всех существующих подзадач
|
||
|
|
-- Позиции присваиваются по порядку id в рамках каждой родительской задачи
|
||
|
|
DO $$
|
||
|
|
DECLARE
|
||
|
|
parent_record RECORD;
|
||
|
|
subtask_record RECORD;
|
||
|
|
pos INTEGER;
|
||
|
|
BEGIN
|
||
|
|
-- Для каждой родительской задачи
|
||
|
|
FOR parent_record IN
|
||
|
|
SELECT DISTINCT parent_task_id
|
||
|
|
FROM tasks
|
||
|
|
WHERE parent_task_id IS NOT NULL
|
||
|
|
ORDER BY parent_task_id
|
||
|
|
LOOP
|
||
|
|
pos := 0;
|
||
|
|
-- Обновляем подзадачи этой родительской задачи
|
||
|
|
FOR subtask_record IN
|
||
|
|
SELECT id
|
||
|
|
FROM tasks
|
||
|
|
WHERE parent_task_id = parent_record.parent_task_id
|
||
|
|
AND deleted = FALSE
|
||
|
|
ORDER BY id
|
||
|
|
LOOP
|
||
|
|
UPDATE tasks
|
||
|
|
SET position = pos
|
||
|
|
WHERE id = subtask_record.id;
|
||
|
|
|
||
|
|
pos := pos + 1;
|
||
|
|
END LOOP;
|
||
|
|
END LOOP;
|
||
|
|
END $$;
|
||
|
|
|
||
|
|
-- Создаем индекс для быстрой сортировки подзадач
|
||
|
|
CREATE INDEX idx_tasks_parent_position ON tasks(parent_task_id, position)
|
||
|
|
WHERE parent_task_id IS NOT NULL AND deleted = FALSE;
|
||
|
|
|
||
|
|
COMMENT ON COLUMN tasks.position IS 'Position of subtask within parent task. NULL for regular tasks.';
|