2010-08-19 22 views
5

यह या तो सभी तालिकाओं से सभी पंक्तियों को एक भी आदेश के साथ postgres में (डेटाबेस को नष्ट किए बिना) को हटाने के लिए, या एक postgres में हटाने के झरना करना संभव है?पोस्टग्रेज़: सभी टेबल हटाएं या हटाएं कैस्केड करें?

यदि नहीं, तो मैं अपना परीक्षण डेटाबेस कैसे रीसेट कर सकता हूं?

उत्तर

7

यह या तो संभव postgres

आप ठीक कह रहे हैं में एक भी आदेश के साथ सभी तालिकाओं से सभी पंक्तियों को नष्ट करने के लिए है, जवाब नहीं

आपको लगता है कि नष्ट करेगा विदेशी कुंजी व्यापक परिभाषित कर सकते हैं है यदि "पैरेंट" हटा दिया गया है तो सभी संदर्भ पंक्तियां। लेकिन यह विदेशी कुंजी का गुण है, कुछ भी आप DELETE कथन

के साथ निर्दिष्ट नहीं कर सकते हैं - वाह।

क्या है कि माना जाता मतलब है?

दूसरे विचार पर: आप क्या हासिल करने की कोशिश कर रहे हैं?

मैं संदेह है कि आप "रीसेट" करने के लिए कोशिश कर रहे हैं जैसे है एक परीक्षण डेटाबेस। उस मामले में PostgreSQL दृष्टिकोण होगा:

  • एक डेटाबेस है कि सब कुछ (टेबल, दृश्य, अनुक्रमित आदि) शामिल हैं आप एक नया डेटाबेस में की जरूरत है (इसे कहते जैसे my_template)
  • अपने वर्तमान परीक्षण रीसेट करने के लिए बनाएं डीबी, परीक्षण डेटाबेस CREATE DATABASE testdb TEMPLATE my_template

नव निर्मित testdb का उपयोग कर सभी तालिकाओं my_template में परिभाषित करना होगा फिर से बनाने के एक DROP DATABASE testdb और फिर। यही कारण है कि शायद एक बहुत सभी पंक्तियों को हटाने की तुलना में तेजी है।

+1

आप सही हैं, वही है जो मैं करने की कोशिश कर रहा था, और मैं निराश हो रहा था कि पोस्टग्रेज़ के पास डेटा को जल्दी से साफ़ करने का कोई आसान तरीका नहीं था। मैं एक टेम्पलेट बनाउंगा - मदद के लिए धन्यवाद। – AP257

+0

जैसा कि आप उम्मीद करते हैं कि "सबकुछ से सब कुछ हटाएं" कथन का प्रकार मैं सोच रहा हूं क्यों? कोई डेटाबेस जो मुझे पता है इसका समर्थन करता है। –

+0

ठीक है, मुझे वास्तव में क्या पसंद है एक डेली कैस्केड है। उस की अनुपस्थिति में, सब कुछ से हटाएं एक स्वीकार्य विकल्प होगा। लेकिन दर्द का थोड़ा सा हिस्सा नहीं है! – AP257

5

आप एक संग्रहीत प्रक्रिया है कि सभी स्कीमा में सभी तालिकाओं का चयन करता है लिख सकता है और उसके बाद करता है एक हटाना कैस्केड या इन तालिकाओं पर TRUNCATE। यह pl/pgsql-code की कुछ पंक्तियां हैं, एक बड़ा सौदा नहीं।

संपादित करें: यह चाल करेगा, लेकिन सावधान रहें! :

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(); 
+3

+1: [TRUNCATE] (http://www.postgresql.org/docs/8.1/interactive/sql-truncate.html) मेरी पसंद होगी - 'डिलीट कैस्केड' का प्रशंसक नहीं, साथ स्क्रू करना बहुत आसान है वसा अंगुली ... –

+0

समाधान केवल तभी कार्य करेगा डेटाबेस जो केवल बहुत ही सरल डेटाबेस के लिए सच हो जाएगा परिभाषित किसी भी विदेशी कुंजी है। लेकिन सभी मौजूदा बाधाओं को पहले छोड़ने के लिए फ़ंक्शन को बढ़ाया जा सकता है, और फिर सभी तालिकाओं को छोटा कर दिया जा सकता है। –

+0

नहीं, ऐसा नहीं है, वह जगह है जहां कैस्केड आता है। बस इसका परीक्षण करें और आप देखेंगे। http://www.postgresql.org/docs/current/static/sql-truncate।एचटीएमएल –

संबंधित मुद्दे