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

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

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

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


当前回答

只需执行下面的查询:

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) || '';
    END LOOP;
END $$;

其他回答

如果我必须这样做,我将简单地创建当前db的schema sql,然后删除并创建db,然后用schema sql加载db。

以下是所涉及的步骤:

1)创建数据库的模式转储(——Schema -only)

Pg_dump mydb -s > schema.sql

2)删除数据库

删除mydb数据库;

3)创建数据库

创建mydb数据库

4)导入模式

PSQL myDB < schema.sql

清洗AUTO_INCREMENT版本:

CREATE OR REPLACE FUNCTION truncate_tables(username IN VARCHAR) RETURNS void AS $$
DECLARE
    statements CURSOR FOR
        SELECT tablename FROM pg_tables
        WHERE tableowner = username AND schemaname = 'public';
BEGIN
    FOR stmt IN statements LOOP
        EXECUTE 'TRUNCATE TABLE ' || quote_ident(stmt.tablename) || ' CASCADE;';

        IF EXISTS (
            SELECT column_name 
            FROM information_schema.columns 
            WHERE table_name=quote_ident(stmt.tablename) and column_name='id'
        ) THEN
           EXECUTE 'ALTER SEQUENCE ' || quote_ident(stmt.tablename) || '_id_seq RESTART WITH 1';
        END IF;

    END LOOP;
END;
$$ LANGUAGE plpgsql;

只需执行下面的查询:

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) || '';
    END LOOP;
END $$;

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

TRUNCATE TABLE table_name RESTART IDENTITY CASCADE;

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

在这种情况下,最好使用一个空数据库作为模板,当需要刷新时,删除现有数据库并从模板创建一个新数据库。