migration_pump_station_shared.sql 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. -- 泵站信息表公用化迁移(KingbaseES / PostgreSQL 兼容)
  2. -- 目标:
  3. -- 1. app_user.water_pump_station 改名为 app_user.pump_station(公用泵站表)
  4. -- 2. 新增 station_type 类型字段:water_supply-供水泵站,drainage-排水泵站
  5. -- 3. 存量数据全部回填为供水泵站,并强制非空与取值域约束
  6. -- 可重复执行;不删除任何业务数据。
  7. -- 对应回滚脚本:rollback_pump_station_shared.sql
  8. -- 1. 表改名(重复执行时旧表已不存在,IF EXISTS 自动跳过;数据、主键、外键保持不变)
  9. ALTER TABLE IF EXISTS app_user.water_pump_station RENAME TO pump_station;
  10. -- 2. 新增泵站类型字段
  11. ALTER TABLE app_user.pump_station ADD COLUMN IF NOT EXISTS station_type varchar(16);
  12. -- 3. 存量数据回填为供水泵站(历史数据均来自供水子系统)
  13. UPDATE app_user.pump_station SET station_type = 'water_supply' WHERE station_type IS NULL;
  14. -- 4. 默认值与非空约束
  15. ALTER TABLE app_user.pump_station ALTER COLUMN station_type SET DEFAULT 'water_supply';
  16. ALTER TABLE app_user.pump_station ALTER COLUMN station_type SET NOT NULL;
  17. COMMENT ON COLUMN app_user.pump_station.station_type IS '泵站类型:water_supply-供水泵站,drainage-排水泵站';
  18. -- 5. 取值域 CHECK 约束(幂等)
  19. DO $$
  20. BEGIN
  21. IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'ck_pump_station_type') THEN
  22. ALTER TABLE app_user.pump_station
  23. ADD CONSTRAINT ck_pump_station_type CHECK (station_type IN ('water_supply', 'drainage'));
  24. END IF;
  25. END $$;
  26. -- 6. 坐标索引随表改名,并新增类型过滤索引(均幂等)
  27. ALTER INDEX IF EXISTS app_user.idx_water_pump_station_lon_lat RENAME TO idx_pump_station_lon_lat;
  28. CREATE INDEX IF NOT EXISTS idx_pump_station_type ON app_user.pump_station (station_type);
  29. -- 7. 主键序列改名(若沿用表名前缀默认命名则存在,幂等处理)
  30. DO $$
  31. BEGIN
  32. IF EXISTS (SELECT 1
  33. FROM pg_class c
  34. JOIN pg_namespace n ON n.oid = c.relnamespace
  35. WHERE n.nspname = 'app_user'
  36. AND c.relname = 'water_pump_station_id_seq') THEN
  37. ALTER SEQUENCE app_user.water_pump_station_id_seq RENAME TO pump_station_id_seq;
  38. END IF;
  39. END $$;
  40. -- 8. 表注释更新为公用泵站表
  41. COMMENT ON TABLE app_user.pump_station IS '公用泵站信息表,按 station_type 区分供水泵站(water_supply)与排水泵站(drainage)';
  42. -- 执行后校验(手动执行确认):
  43. -- SELECT station_type, COUNT(*) FROM app_user.pump_station GROUP BY station_type;
  44. -- SELECT column_name, data_type, is_nullable, column_default
  45. -- FROM information_schema.columns WHERE table_schema='app_user' AND table_name='pump_station' AND column_name='station_type';