2015-10-27 143 views
1

我有一個數據庫與大量的表。從PostgreSQL刪除所有內容

有沒有辦法清除表中的內容,而不是爲每個表做這些事情!我的意思是一種迭代數據庫表列表並刪除其內容的方法。

謝謝你的幫助。

+0

pg_dump如何設置schema-only標誌?你不會說哪個版本的Postgres,所以我會發布9.1的鏈接。 http://www.postgresql.org/docs/9.1/static/app-pgdump.html – ojf

+0

爲什麼你不刪除整個數據庫並重新創建它的任何原因? – kliron

+0

@ojf我有版本9.3.9在Linux上運行 – user3232446

回答

3

它迭代模式中的所有表,清除他的內容一個簡單的數據庫功能。 警告:此功能清除所有表格,不詢問您是否確定:)謹慎使用!沒有保修!

CREATE OR REPLACE FUNCTION clear_tables_in_schema(_schemaname TEXT)RETURNS VOID AS 
    $$ 
    DECLARE _tablename TEXT; 
    BEGIN 
    FOR _tablename IN SELECT tablename FROM pg_catalog.pg_tables WHERE schemaname = _schemaname LOOP 
     RAISE INFO 'Clearing table %.%', _schemaname, _tablename ; 
     EXECUTE format('TRUNCATE %I.%I CASCADE;', _schemaname, _tablename); 
    END LOOP; 
    IF NOT FOUND THEN 
     RAISE WARNING 'Schema % does not exist', _schemaname; 
    END IF; 
    END;  
    $$ 
LANGUAGE plpgsql; 
-- Usage: 
SELECT clear_tables_in_schema('your_schema'); 
+0

您的偉人! thx – user3232446

+0

由於外鍵導致的任何嚴重數據庫都會失敗 - 您無法截斷其他表引用的表。您需要一次截斷所有表格。 –

+0

謝謝,我添加了「CASCADE」子句。 @ user3232446:我更新我的答案並修改了功能。 –

0

喜歡的東西:

#!/bin/bash 

# Save the schema 
pg_dump -U user --format plain --schema-only --file db_schema.sql dbname  

com="psql -h host -U user -d dbname" 

$com <<EOF 
DROP TABLE foo; 
DROP TABLE bar; 
DROP TABLE baz; 
# ... more tables here ... 
EOF 

# Recreate all tables 
$com < db_schema.sql 
+0

當然,以上假設表名是恆定的並且事先已知。如果沒有,請使用下面的Tommaso解決方案,或者如果您感覺hackier grep db_schema文件中的名稱:-) – kliron