PostgreSQL数据库批量删除唯一索引
要批量删除PostgreSQL数据库中非系统模式的所有唯一索引,可以使用以下脚本。请谨慎操作,建议提前备份数据并验证生成的SQL语句。
生成删除索引的SQL命令:
以下命令生成所有符合条件的唯一索引的DROP INDEX
语句,并保存到临时文件:
PGPASSWORD='Hello@123' psql -t -A -U postgres -d postgres -h 127.0.0.1 -c "SELECTDISTINCT 'ALTER TABLE public.' || tab.table_name || ' REPLICA IDENTITY FULL;'
FROMinformation_schema.tables tab
LEFT JOIN information_schema.table_constraints tco ON tab.table_schema = tco.table_schemaAND tab.table_name = tco.table_nameAND tco.constraint_type = 'PRIMARY KEY'
LEFT JOIN pg_class tac ON tac.relname = tab.table_nameAND tac.relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = 'public')
WHEREtab.table_type = 'BASE TABLE'AND tab.table_schema = 'public'AND tco.constraint_name IS NULLAND (tac.relreplident IS DISTINCT FROM 'f' OR tac.relreplident IS NULL );" > /tmp/delete_index.sql
输出示例
执行后,`/tmp/delete_index.sql`文件内容将仅包含:
ALTER TABLE public.t0420 REPLICA IDENTITY FULL;
ALTER TABLE public.t0421 REPLICA IDENTITY FULL;
参数说明
- **`-t` 或 `--tuples-only`**:关闭列标题和行数统计(如`(2 rows)`)。
- **`-A` 或 `--no-align`**:使用非对齐输出格式,避免多余的空白符。
这两个参数组合使用后,能确保输出结果为纯净的 SQL 语句,可直接用于后续执行。