-- ============================================================================ -- 平台主键切换:PostgreSQL identity/serial → 应用侧雪花 ID -- -- 目标库:PostgreSQL master(zsjz-ai 平台库) -- 执行方式:手工执行(项目无 Flyway / Liquibase);可重复执行 -- -- 变更后: -- agent.row_id 由 AgentEntity 的 IdType.ASSIGN_ID 生成 -- case_info.id 由 CaseInfo 的 IdType.ASSIGN_ID 生成 -- sys_user.id 由 SysUser 的 IdType.ASSIGN_ID 生成 -- gateway_user_route.id 由 UserRouteRepository 的 IdWorker.getId() 生成 -- -- 存量行保留原 id;新行必须由应用显式提供 id,数据库不再有默认值/序列。 -- 迁移前请停止 ai-server / ai-gateway,避免旧进程继续按无 id 插入。 -- ============================================================================ -- 1. identity 列(agent / case_info) ALTER TABLE IF EXISTS agent ALTER COLUMN row_id DROP IDENTITY IF EXISTS; ALTER TABLE IF EXISTS case_info ALTER COLUMN id DROP IDENTITY IF EXISTS; -- 2. serial 列(sys_user / gateway_user_route) ALTER TABLE IF EXISTS sys_user ALTER COLUMN id DROP IDENTITY IF EXISTS; ALTER TABLE IF EXISTS sys_user ALTER COLUMN id DROP DEFAULT; ALTER TABLE IF EXISTS gateway_user_route ALTER COLUMN id DROP IDENTITY IF EXISTS; ALTER TABLE IF EXISTS gateway_user_route ALTER COLUMN id DROP DEFAULT; -- 3. 删除遗留序列(identity 序列可能已被 DROP IDENTITY 一并删除) DROP SEQUENCE IF EXISTS public.dataagent_agent_row_id_seq; DROP SEQUENCE IF EXISTS public.case_info_id_seq; DROP SEQUENCE IF EXISTS public.sys_user_id_seq; DROP SEQUENCE IF EXISTS public.gateway_user_route_id_seq; -- 4. 注释同步(避免继续显示“自增”;表不存在时跳过,保证脚本可用于部分环境) DO $$ BEGIN IF to_regclass('public.agent') IS NOT NULL THEN COMMENT ON COLUMN agent.row_id IS '主键 ID(MyBatis-Plus 雪花算法生成)'; END IF; IF to_regclass('public.case_info') IS NOT NULL THEN COMMENT ON COLUMN case_info.id IS '案件 ID(MyBatis-Plus 雪花算法生成)'; END IF; IF to_regclass('public.sys_user') IS NOT NULL THEN COMMENT ON COLUMN sys_user.id IS '用户 ID(MyBatis-Plus 雪花算法生成)'; END IF; IF to_regclass('public.gateway_user_route') IS NOT NULL THEN COMMENT ON COLUMN gateway_user_route.id IS '路由 ID(应用侧雪花算法生成)'; END IF; END $$; -- 5. 校验:以下应为 0 行 SELECT c.relname AS table_name, a.attname AS column_name, a.attidentity, pg_get_expr(ad.adbin, ad.adrelid) AS column_default, pg_get_serial_sequence(format('%I.%I', n.nspname, c.relname), a.attname) AS serial_sequence FROM pg_attribute a JOIN pg_class c ON c.oid = a.attrelid JOIN pg_namespace n ON n.oid = c.relnamespace LEFT JOIN pg_attrdef ad ON ad.adrelid = a.attrelid AND ad.adnum = a.attnum WHERE n.nspname = 'public' AND c.relkind = 'r' AND a.attnum > 0 AND NOT a.attisdropped AND (c.relname, a.attname) IN ( ('agent', 'row_id'), ('case_info', 'id'), ('sys_user', 'id'), ('gateway_user_route', 'id') ) AND (a.attidentity <> '' OR ad.adbin IS NOT NULL OR pg_get_serial_sequence( format('%I.%I', n.nspname, c.relname), a.attname) IS NOT NULL);