在 PostgreSQL 中截断模式中的所有表

Truncating all the tables in a schema in PostgreSQL

我正在尝试使用 PostgreSQL 截断模式中的所有表。它显示此错误:

ERROR:  relation "Building" does not exist
CONTEXT:  SQL statement "TRUNCATE TABLE "Building" CASCADE"
PL/pgSQL function truncate_schema(character varying) line 15 at EXECUTE statement

这是我使用的函数:

CREATE OR REPLACE FUNCTION truncate_schema(schema IN VARCHAR) RETURNS void AS $
DECLARE
    statements CURSOR FOR
        SELECT table_name FROM information_schema.tables
WHERE table_type = 'BASE TABLE' AND table_schema = schema;
BEGIN
    FOR stmt IN statements LOOP
        EXECUTE 'TRUNCATE TABLE ' || quote_ident(stmt.table_name) || ' CASCADE';
    END LOOP;
END;
$ LANGUAGE plpgsql;

如何正确执行此操作?

这可能是因为您没有在 TRUNCATE 语句中包含架构名称,所以它在 public 架构中查找 table。

尝试将 TRUNCATE 语句更改为如下内容:

EXECUTE 'TRUNCATE TABLE ' || quote_ident(stmt.table_schema) || '.' ||
    quote_ident(stmt.table_name) || ' CASCADE';

此外,关于 CASCADE 需要记住的一点是,它将 TRUNCATE 任何具有 [=30= 的 table ]foreign-key 与 table 的关系,它可以包括 table 在该模式之外。

根据 OP 的评论进行编辑:

您还需要将 table_schema 添加到 statements 后面的查询,以便它在 EXECUTE 语句中可用。

这样试试

CREATE OR REPLACE FUNCTION truncate_schema(_schema character varying)
  RETURNS void AS
$BODY$
declare
    selectrow record;
begin
for selectrow in
select 'TRUNCATE TABLE ' || quote_ident(_schema) || '.' ||quote_ident(t.table_name) || ' CASCADE;' as qry 
from (
     SELECT table_name 
     FROM information_schema.tables
     WHERE table_type = 'BASE TABLE' AND table_schema = _schema
     )t
loop
execute selectrow.qry;
end loop;
end;
$BODY$
  LANGUAGE plpgsql