我经常需要在重建之前删除PostgreSQL数据库中的所有数据。如何在SQL中直接做到这一点?

目前,我已经设法想出了一个SQL语句,返回我需要执行的所有命令:

SELECT 'TRUNCATE TABLE ' ||  tablename || ';' FROM pg_tables WHERE tableowner='MYUSER';

但是,一旦我有了它们,我就看不到以编程方式执行它们的方法。


当前回答

我在这里没有看到的一件事是截断然后重置序列。请注意,像这里给出的所有截断一样,简单的截断只会截断表,但会使序列保持截断前的值。要在截断do时将序列重置为起始值:

TRUNCATE TABLE table_name RESTART IDENTITY CASCADE;

你可以把这个RESTART IDENTITY添加到任何你想要的答案中,没有必要在这里重复。CASCADE是针对您可能面临的任何外键约束的。

其他回答

你也可以用bash这样做:

#!/bin/bash
PGPASSWORD='' psql -h 127.0.0.1 -Upostgres sng --tuples-only --command "SELECT 'TRUNCATE TABLE ' || schemaname || '.' ||  tablename || ';' FROM pg_tables WHERE schemaname in ('cms_test', 'ids_test', 'logs_test', 'sps_test');" | 
tr "\\n" " " | 
xargs -I{} psql -h 127.0.0.1 -Upostgres sng --command "{}"

您需要调整模式名称、密码和用户名以匹配您的模式。

简单地说,你可以运行下面这段SQL:

DO $$ DECLARE
  r RECORD;
BEGIN
  FOR r IN (SELECT tablename FROM pg_tables WHERE schemaname =current_schema()) LOOP
    EXECUTE 'TRUNCATE TABLE ' || quote_ident(r.tablename) || ' CASCADE';
  END LOOP;
END $$;

如果你会使用psql,你可以使用\gexec元命令来执行查询输出;

SELECT
    format('TRUNCATE TABLE %I.%I', ns.nspname, c.relname)
  FROM pg_namespace ns 
  JOIN pg_class c ON ns.oid = c.relnamespace
  JOIN pg_roles r ON r.oid = c.relowner
  WHERE
    ns.nspname = 'table schema' AND                               -- add table schema criteria 
    r.rolname = 'table owner' AND                                 -- add table owner criteria
    ns.nspname NOT IN ('pg_catalog', 'information_schema') AND    -- exclude system schemas
    c.relkind = 'r' AND                                           -- tables only
    has_table_privilege(c.oid, 'TRUNCATE')                        -- check current user has truncate privilege
  \gexec 

注意,\gexec是在9.6版本中引入的

伙计们,更好更干净的方法是:

1)创建数据库的模式转储(——Schema -only) Pg_dump mydb -s > schema.sql

2)删除数据库 删除mydb数据库;

3)创建数据库 创建mydb数据库

4)导入模式 PSQL mydb < schema.sql

这是我的工作!

祝你有愉快的一天。 希兰沃克

我在这里没有看到的一件事是截断然后重置序列。请注意,像这里给出的所有截断一样,简单的截断只会截断表,但会使序列保持截断前的值。要在截断do时将序列重置为起始值:

TRUNCATE TABLE table_name RESTART IDENTITY CASCADE;

你可以把这个RESTART IDENTITY添加到任何你想要的答案中,没有必要在这里重复。CASCADE是针对您可能面临的任何外键约束的。