प्लस्पगक्ल में स्पष्ट रूप से अभिशाप की आवश्यकता होती है। लूप के सरल और तेज़ निहित कर्सर का उपयोग करें FOR
:
नोट: चूँकि तालिका के नाम प्रति डेटाबेस के लिए अद्वितीय नहीं हैं, इसलिए आपको सुनिश्चित करने के लिए स्कीमा-योग्यता तालिका नामों को रखना होगा। इसके अलावा, मैं फ़ंक्शन को डिफ़ॉल्ट स्कीमा 'सार्वजनिक' तक सीमित करता हूं। अपनी आवश्यकताओं के अनुकूल, लेकिन सिस्टम स्कीमा को बाहर करना सुनिश्चित करें pg_*
और information_schema
।
Be बहुत सावधान इन कार्यों के साथ। वे आपके डेटाबेस को न्यूड करते हैं। मैंने एक बाल सुरक्षा उपकरण जोड़ा। बम को प्राइम करने के लिए RAISE NOTICE
लाइन और असहजता EXECUTE
पर टिप्पणी करें ...
CREATE OR REPLACE FUNCTION f_truncate_tables(_username text)
RETURNS void AS
$func$
DECLARE
_tbl text;
_sch text;
BEGIN
FOR _sch, _tbl IN
SELECT schemaname, tablename
FROM pg_tables
WHERE tableowner = _username
AND schemaname = 'public'
LOOP
RAISE NOTICE '%',
-- EXECUTE -- dangerous, test before you execute!
format('TRUNCATE TABLE %I.%I CASCADE', _sch, _tbl);
END LOOP;
END
$func$ LANGUAGE plpgsql;
format()
9.1 या बाद के पोस्टग्रेज की आवश्यकता है। पुराने संस्करणों में क्वेरी स्ट्रिंग को इस तरह संक्षिप्त करें:
'TRUNCATE TABLE ' || quote_ident(_sch) || '.' || quote_ident(_tbl) || ' CASCADE';
एकल आदेश, कोई लूप नहीं
चूँकि हम TRUNCATE
एक साथ कई तालिकाओं की आवश्यकता कर सकते हैं, इसलिए हमें किसी भी कर्सर या लूप की आवश्यकता नहीं है:
सभी तालिका नामों को अलग करें और किसी एक कथन को निष्पादित करें। सरल, तेज:
CREATE OR REPLACE FUNCTION f_truncate_tables(_username text)
RETURNS void AS
$func$
BEGIN
RAISE NOTICE '%',
-- EXECUTE -- dangerous, test before you execute!
(SELECT 'TRUNCATE TABLE '
|| string_agg(format('%I.%I', schemaname, tablename), ', ')
|| ' CASCADE'
FROM pg_tables
WHERE tableowner = _username
AND schemaname = 'public'
);
END
$func$ LANGUAGE plpgsql;
कॉल करें:
SELECT truncate_tables('postgres');
परिष्कृत क्वेरी
तुम भी एक समारोह की जरूरत नहीं है। 9.0+ पोस्टग्रैज में आप एक DO
बयान में डायनामिक कमांड निष्पादित कर सकते हैं । और Postgres में 9.5+ सिंटैक्स भी सरल हो सकता है:
DO
$func$
BEGIN
RAISE NOTICE '%',
-- EXECUTE
(SELECT 'TRUNCATE TABLE ' || string_agg(oid::regclass::text, ', ') || ' CASCADE'
FROM pg_class
WHERE relkind = 'r' -- only tables
AND relnamespace = 'public'::regnamespace
);
END
$func$;
और pg_class
, के बीच अंतर के बारे में :pg_tables
information_schema.tables
regclass
तालिका नामों के बारे में और उद्धृत:
बार-बार उपयोग के लिए
अपनी वेनिला संरचना और सभी खाली तालिकाओं के साथ एक "टेम्पलेट" डेटाबेस (इसे नाम दें my_template
) बनाएं । फिर एक के माध्यम से जाना DROP
/CREATE DATABASE
चक्र:
DROP DATABASE mydb;
CREATE DATABASE mydb TEMPLATE my_template;
यह बहुत तेज़ है , क्योंकि Postgres फ़ाइल स्तर पर संपूर्ण संरचना की प्रतिलिपि बनाता है। कोई समसामयिक समस्या या अन्य ओवरहेड आपको धीमा नहीं कर रहा है।
यदि समवर्ती कनेक्शन आपको DB छोड़ने से रोकते हैं, तो विचार करें: