2011-03-11 10 views
50

में नाम से ड्रॉप बाधा केवल नाम जानने के द्वारा पोस्टग्रेस्क्ल में एक बाधा नाम कैसे छोड़ सकता हूं? मेरे पास ऐसी बाधाओं की एक सूची है जो किसी तृतीय पक्ष स्क्रिप्ट द्वारा स्वत: उत्पन्न की जाती हैं। मुझे टेबल नाम को केवल बाधा नाम जानने के बिना उन्हें हटाना होगा।Postgresql

SELECT * 
FROM information_schema.constraint_table_usage 
WHERE table_name = 'your_table' 

वैकल्पिक रूप से आप pg_constraint उपयोग कर सकते हैं इस जानकारी

select n.nspname as schema_name, 
     t.relname as table_name, 
     c.conname as constraint_name 
from pg_constraint c 
    join pg_class t on c.conrelid = t.oid 
    join pg_namespace n on t.relnamespace = n.oid 
where t.relname = 'your_table_name'; 

तो फिर तुम आवश्यक परिवर्तन तालिका कथन चला सकते हैं पुनः प्राप्त करने के:

+0

पीजी का कौन सा संस्करण आप पर हैं? – Kuberchaun

उत्तर

84

आप निम्न क्वेरी चलाकर तालिका नामों को पुनः प्राप्त करने की जरूरत है:

ALTER TABLE your_table DROP CONSTRAINT constraint_name; 

बेशक आप क्वेरी पूरा बदलने बयान वापसी कर सकते हैं:

SELECT 'ALTER TABLE '||table_name||' DROP CONSTRAINT '||constraint_name||';' 
FROM information_schema.constraint_table_usage 
WHERE table_name in ('your_table', 'other_table') 

मत भूलना कहां खंड में TABLE_SCHEMA (और ALTER बयान) शामिल करने के लिए यदि एक ही टेबल के साथ एकाधिक स्कीमा कर रहे हैं।

8

यदि आप पीजी के 9.x पर हैं तो आप इसे चलाने के लिए डीओ स्टेटमेंट का उपयोग कर सकते हैं। बस करें a_horse_with_no_name ने क्या किया, लेकिन इसे डीओ स्टेटमेंट पर लागू करें।

DO $$DECLARE r record; 
    BEGIN 
     FOR r IN SELECT table_name,constraint_name 
       FROM information_schema.constraint_table_usage 
       WHERE table_name IN ('your_table', 'other_table') 
     LOOP 
      EXECUTE 'ALTER TABLE ' || quote_ident(r.table_name)|| ' DROP CONSTRAINT '|| quote_ident(r.constraint_name) || ';'; 
     END LOOP; 
    END$$; 
+0

+1, यदि संभव हो तो डीओ कथन का उपयोग करने का अच्छा विचार –