是否可以使用postgres中的单个命令删除所有表中的所有行(不破坏数据库),或者在postgres中级联删除?
如果没有,那我该如何重置测试数据库?
答案 0 :(得分:7)
是否可以使用postgres中的单个命令删除所有表中的所有行
你是对的,答案是否
您可以定义级联外键,如果删除“父级”,将删除所有引用行。但这是外键的属性,您无法使用DELETE语句指定任何内容
如果没有 - 哇。
这是什么意思?
第二个想法:你想要实现什么?
我怀疑你是在试图“重置”,例如一个测试数据库。在这种情况下,PostgreSQL方法将是:
DROP DATABASE testdb
,然后使用CREATE DATABASE testdb TEMPLATE my_template
新创建的testdb将在my_template中定义所有表。这可能比删除所有行的速度快很多。
答案 1 :(得分:5)
您可以编写一个存储过程来选择所有模式中的所有表,然后对这些表执行DELETE CASCADE或TRUNCATE。它只是几行pl / pgsql代码,没什么大不了的。
编辑:这可以解决问题,但要小心! :
CREATE OR REPLACE FUNCTION truncate_all() RETURNS void LANGUAGE plpgsql AS
$$
DECLARE
row record;
query text;
BEGIN
query := 'SELECT table_schema, table_name FROM information_schema.tables WHERE table_schema NOT IN(''pg_catalog'', ''information_schema'') AND table_type = ''BASE TABLE''';
FOR row IN EXECUTE query LOOP
EXECUTE 'TRUNCATE ' || quote_ident(row.table_schema) || '.' || quote_ident(row.table_name) || ' CASCADE;';
END LOOP;
RETURN;
END;
$$;
-- execute:
SELECT truncate_all();