मैं सिर्फ नाम जानकर Postgresql में एक बाधा नाम कैसे छोड़ सकता हूं? मेरे पास उन बाधाओं की एक सूची है जो एक 3 पार्टी स्क्रिप्ट द्वारा ऑटोजेनरेटेड हैं। मुझे टेबल का नाम सिर्फ बाधा नाम जानने के बिना उन्हें हटाने की आवश्यकता है।
जवाबों:
आपको निम्नलिखित क्वेरी चलाकर तालिका नामों को पुनः प्राप्त करना होगा:
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';
तब आप आवश्यक चेतावनी बयान चला सकते हैं:
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 को शामिल करना न भूलें।
यदि आपके पीजी के 9.x पर आप इसे चलाने के लिए DO स्टेटमेंट का उपयोग कर सकते हैं। बस वही करें जो a_horse_with_no_name ने किया था, लेकिन इसे DO स्टेटमेंट पर लागू करें।
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$$;
- सही विदेशी कुंजी बाधा छोड़ें
ALTER TABLE affiliations
DROP CONSTRAINT affiliations_organization_id_fkey;
ध्यान दें:
संबद्धता -> तालिका का नाम
एफिलिएशन_ऑर्गनाइजेशन_आईडी_फेक -> कॉन्ट्रिंट नाम