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