在 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
我正在尝试使用 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