【发布时间】:2014-08-25 17:48:11
【问题描述】:
在我的数据库中有 113 个表,
- 例如我需要
drop名称为ilike '%gtab%'的表
【问题讨论】:
标签: postgresql
在我的数据库中有 113 个表,
drop 名称为ilike '%gtab%' 的表
【问题讨论】:
标签: postgresql
这将创建语句来删除所述表和不与该模式匹配的其他对象。也没有系统表。
SELECT 'DROP TABLE ' || c.oid::regclass || ';'
FROM pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace -- to restrict to a schema
WHERE c.relkind = 'r' -- only tables
AND c.relname ILIKE '%gtab%' -- pattern for table names
AND n.nspname = 'public' -- restrict to a schema
ORDER BY 1;
转换为 regclass 会根据需要自动转义和模式限定表名,并且可以安全地防止 SQL 注入。详情:
对于很多表,单个集成语句会更快:
SELECT 'DROP TABLE ' || string_agg(c.oid::regclass::text, ', ') || ';'
FROM pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind = 'r'
AND c.relname ILIKE '%gtab%'
AND n.nspname = 'public'
ORDER BY 1;
结果:
DROP TABLE tbl1, tbl2, schema1.tbl3;
相关答案:
【讨论】:
获取名称为gtab的表
select relname from pg_class where relname ilike '%gtab%' and relname not ilike
'%seq%' and relname not ilike '%pkey%' and relname not ilike '%idx%'
如果您想获取drop query,只需使用COPY 函数导出到.CSV 文件,然后从导出的csv 文件中复制您的所有drop 查询和execute 它为pgScript
copy (select 'drop table ' || relname || ' cascade;' from pg_class where relname
ilike '%gtab%' and relname not ilike '%seq%'and relname not ilike '%pkey%' and
relname not ilike '%idx%' ) to'D:\DropScript.csv' with csv header
【讨论】:
pgAdmin 并作为pgScript 运行吗???
COPY 尝试将其作为一个函数
pgScript。
你可以在loop:
t=# begin;
BEGIN
t=# do
t-# $$
t$# declare r record;
t$# begin
t$# for r in (select schemaname||'.'||tablename tn from pg_tables where tablename like '%gtab%') loop
t$# raise info '%','dropping '||r.tn;
t$# execute CONCAT('DROP TABLE '||r.tn);
t$# end loop;
t$# end;
t$# $$
t-# ;
INFO: dropping public.agtab
INFO: dropping public.bgtabb
DO
t=# rollback;
ROLLBACK
【讨论】: