Files
akmon/doc_news/fix_indexes.sql
2026-01-20 08:04:15 +08:00

79 lines
2.5 KiB
SQL

-- ===================================================================
-- 数据库清理和重建脚本
-- 用于解决索引和表已存在的问题
-- 在执行主数据库脚本前运行此脚本
-- ===================================================================
-- 设置客户端编码
SET client_encoding = 'UTF8';
-- 删除可能已存在的索引
DO $$
DECLARE
r RECORD;
BEGIN
-- 删除所有以 idx_ 开头的索引
FOR r IN (SELECT indexname FROM pg_indexes WHERE indexname LIKE 'idx_%' AND schemaname = 'public')
LOOP
EXECUTE 'DROP INDEX IF EXISTS public.' || quote_ident(r.indexname);
RAISE NOTICE '删除索引: %', r.indexname;
END LOOP;
RAISE NOTICE '所有相关索引已清理完成!';
END $$;
-- 删除可能已存在的触发器
DO $$
DECLARE
r RECORD;
BEGIN
FOR r IN (SELECT trigger_name, event_object_table
FROM information_schema.triggers
WHERE trigger_schema = 'public'
AND trigger_name LIKE 'trigger_%')
LOOP
EXECUTE 'DROP TRIGGER IF EXISTS ' || quote_ident(r.trigger_name) || ' ON public.' || quote_ident(r.event_object_table);
RAISE NOTICE '删除触发器: % on %', r.trigger_name, r.event_object_table;
END LOOP;
RAISE NOTICE '所有相关触发器已清理完成!';
END $$;
-- 删除可能已存在的函数
DO $$
DECLARE
r RECORD;
BEGIN
FOR r IN (SELECT proname, oidvectortypes(proargtypes) as args
FROM pg_proc p JOIN pg_namespace n ON p.pronamespace = n.oid
WHERE n.nspname = 'public'
AND proname IN ('update_favorite_folder_count', 'update_content_favorite_stats',
'update_content_share_stats', 'generate_share_code', 'update_share_analytics'))
LOOP
EXECUTE 'DROP FUNCTION IF EXISTS public.' || quote_ident(r.proname) || '(' || r.args || ')';
RAISE NOTICE '删除函数: %', r.proname;
END LOOP;
RAISE NOTICE '所有相关函数已清理完成!';
END $$;
-- 可选:删除可能已存在的表(谨慎使用!)
/*
DO $$
DECLARE
r RECORD;
BEGIN
FOR r IN (SELECT tablename FROM pg_tables
WHERE schemaname = 'public'
AND tablename LIKE 'ak_%')
LOOP
EXECUTE 'DROP TABLE IF EXISTS public.' || quote_ident(r.tablename) || ' CASCADE';
RAISE NOTICE '删除表: %', r.tablename;
END LOOP;
RAISE NOTICE '所有相关表已删除!';
END $$;
*/
RAISE NOTICE '数据库清理完成!现在可以运行主数据库脚本了。';