我想使用一个sql命令/查询从同一数据库中删除所有共享相同前缀("supenh_agk")的表.

推荐答案

要在one命令中执行此操作,需要在DO语句(或函数)中使用EXECUTE动态SQL:

DO
$do$
DECLARE
   _tbl text;
BEGIN
FOR _tbl  IN
    SELECT quote_ident(table_schema) || '.'
        || quote_ident(table_name)      -- escape identifier and schema-qualify!
    FROM   information_schema.tables
    WHERE  table_name LIKE 'prefix' || '%'  -- your table name prefix
    AND    table_schema NOT LIKE 'pg\_%'    -- exclude system schemas
LOOP
   RAISE NOTICE '%',
-- EXECUTE
  'DROP TABLE ' || _tbl;  -- see below
END LOOP;
END
$do$;

这包括当前用户可以访问的all个模式中的表.为了安全起见,我排除了系统模式.

如果没有正确转义标识符,那么对于任何需要双引号的非标准identifier,代码都会失败

Potentially hazardous!.所有这些桌子都被永久丢弃了.我建了一个保险箱.在实际执行之前判断生成的语句:注释RAISE并取消注释EXECUTE.

如果任何其他对象(如视图等)依赖于某个表,则会收到一条信息性错误消息,从而取消整个事务.如果您确信所有受抚养人也可能死亡,请附上CASCADE:

  'DROP TABLE ' || _tbl || ' CASCADE;

密切相关:

Alternatively您可以在目录表pg_class的基础上进行构建,目录表pg_class还提供了表的oid,并且速度更快:

...
FOR _tbl  IN
    SELECT c.oid::regclass::text  -- escape identifier and schema-qualify!
    FROM   pg_catalog.pg_class c
    JOIN   pg_catalog.pg_namespace n ON n.oid = c.relnamespace
    WHERE  n.nspname NOT LIKE 'pg\_%'     -- exclude system schemas
    AND    c.relname LIKE 'prefix' || '%' -- your table name prefix
    AND    c.relkind = 'r'                -- only tables
...

系统目录还是信息模式?

c.oid::regclass如何抵御SQL注入?

Or.在一个single 100 command小时内完成这一切.应该更高效一些:

DO
$do$
BEGIN
   RAISE NOTICE '%', (
-- EXECUTE (
   SELECT 'DROP TABLE ' || string_agg(format('%I.%I', schemaname, tablename), ', ')
   --  || ' CASCADE' -- optional
   FROM   pg_catalog.pg_tables t
   WHERE  schemaname NOT LIKE 'pg\_%'     -- exclude system schemas
   AND    tablename LIKE 'prefix' || '%'  -- your table name prefix
   );
END
$do$;

相关的:

使用上一个示例中方便安装的系统目录pg_tables.为了方便起见,format().见:

Postgresql相关问答推荐

Postgs SQL用于比较两个表之间的数据并填充到目标中

当通过PostgreSQL FDW中的视图使用时,年龄函数的计算方式不同

将CSV文件复制到临时表

让Docker Compose Container等待容器PostgreSQL并恢复

使用 pgAdmin 4 v7.4 在 Windows 11 上全新安装 PostgreSQL 15.3-3 无法启动 - 卡在正在加载 pgAdmin 4 v7.4...

如何在 postgres 中查询键设置为空值的 jsonb 字段

在 Age Viewer 上看不到 node 的第一个属性

postgres 如何计算多列哈希?

如何在 PSQL 中查找从另一个表继承的子表

推送到 Heroku 时出现带有 Postgres 的 Rails 迁移错误

SQLAlchemy 中使用什么类型存储字节字符串?

如何通过我在 PostgreSQL 中的数据库获取列大小和类型

使用 try/except 与 psycopg2 或with closing?

使用 postgres regexp_replace 将字符串列表替换为始终相同的字符串

为什么 PostgreSQL 数组访问在 C 中比在 PL/pgSQL 中快得多?

大型查询后 psycopg2 泄漏内存

在 postgres 中创建超级用户

PGError:错误: column of relation does not exist

如何在Postgres中分组并返回总和行

如何在 PostgreSQL 中获取数组的最后一个元素?