Files
backend_v2/db/migrations/2026-10-16-02-brands-renumber-repair.sql
toom1996 1de1ec46a6 update
2026-10-18 17:42:10 +08:00

44 lines
1.7 KiB
SQL
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- 2026-10-16-02-brands-renumber-repair.sql
--
-- 修复 2026-10-16-01 初版留下的半途状态:初版第 ② 步的 JOIN 条件写错(拿子查询里的 -id
-- 去比 b.id),一行都没匹配上,于是只完成了「整批挪到负区间」,紧接着第 ③ 步按当时的最大正值
-- (19)设了序列。结果:23218 个品牌的 id 变成负数、序列指向 20。
--
-- 本迁移把负数行按原 id 升序落回 20.. 的连续区间,并重新对齐序列。
-- 若 01 已正确完成(不存在负数行),本迁移直接跳过 —— 因此对全新建库也是无副作用的。
--
-- 安全性同上:没有任何行引用这批 id(brand_runways.brand_id 最大 7)。19 个种子不动。
DO $$
DECLARE
v_moved integer;
v_after integer;
BEGIN
IF NOT EXISTS (SELECT 1 FROM brands WHERE id < 0) THEN
RAISE NOTICE '[brands-renumber-repair] 不存在负数行,无需修复,跳过';
RETURN;
END IF;
-- 目标区间若已被占用,继续重排会撞主键:宁可中止也不要写出坏数据。
IF EXISTS (SELECT 1 FROM brands WHERE id BETWEEN 20 AND 3096) THEN
RAISE EXCEPTION '[brands-renumber-repair] 20..3096 已被占用,重排会撞主键,已中止';
END IF;
UPDATE brands b
SET id = m.new_id
FROM (
SELECT id AS neg_id,
(row_number() OVER (ORDER BY -id))::integer + 19 AS new_id
FROM brands
WHERE id < 0
) m
WHERE b.id = m.neg_id;
GET DIAGNOSTICS v_moved = ROW_COUNT;
SELECT max(id) INTO v_after FROM brands;
PERFORM setval(pg_get_serial_sequence('brands', 'id'), v_after);
RAISE NOTICE '[brands-renumber-repair] 完成:% 行落回连续区间,id 最大值 %,序列下次给出 %',
v_moved, v_after, v_after + 1;
END $$;