我试图使用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;
如何正确地做到这一点?
答案 0 :(得分:7)
试试这个
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
答案 1 :(得分:2)
这可能是因为您未在TRUNCATE
语句中包含架构的名称,因此它正在public
架构中查找该表。
尝试将TRUNCATE
语句更改为以下内容:
EXECUTE 'TRUNCATE TABLE ' || quote_ident(stmt.table_schema) || '.' ||
quote_ident(stmt.table_name) || ' CASCADE';
此外,CASCADE
要注意的是TRUNCATE
与外键关系的任何表 table,可以包含该模式之外的表。
根据OP的评论进行编辑:
您还需要将table_schema
添加到statements
后面的查询中,以便在EXECUTE
语句中可用。