क्या एक टेबल से सभी नल बाधाओं को एक बार में छोड़ना संभव है?एक पोस्टग्रेएसक्यूएल तालिका से सभी नल बाधाओं को कैसे छोड़ें
मेरे पास बहुत सारी बाधाओं के साथ एक बड़ी मेज है और मैं ऐसे समाधान की तलाश कर रहा हूं जो उन्हें अलग से छोड़ने से तेज़ है।
क्या एक टेबल से सभी नल बाधाओं को एक बार में छोड़ना संभव है?एक पोस्टग्रेएसक्यूएल तालिका से सभी नल बाधाओं को कैसे छोड़ें
मेरे पास बहुत सारी बाधाओं के साथ एक बड़ी मेज है और मैं ऐसे समाधान की तलाश कर रहा हूं जो उन्हें अलग से छोड़ने से तेज़ है।
आप कर सकते हैं समूह उन सब को एक ही बदलने बयान में:
alter table tbl alter col1 drop not null,
alter col2 drop not null,
…
तुम भी यदि आप एक do block लेखन उत्पन्न करने के लिए की जरूरत है की तरह लग रहा है, सूची से प्रासंगिक स्तंभों की सूची प्राप्त कर सकते हैं एसक्यूएल। उदाहरण के लिए, कुछ की तरह:
select a.attname
from pg_catalog.pg_attribute a
where attrelid = 'tbl'::regclass
and a.attnum > 0
and not a.attisdropped
and a.attnotnull;
(। ध्यान दें कि यह ताकि आप उन को फ़िल्टर करना चाहते हैं, भी प्राथमिक कुंजी से संबंधित क्षेत्र शामिल होंगे)
आप ऐसा करते हैं, नहीं है कॉलम नामों में संभावित अजीब पात्रों से निपटने के लिए आपको कभी भी quote_ident()
का उपयोग करना भूल जाएं।
आपकी क्वेरी बहुत बढ़िया है। मैंने कभी कैटलॉग पूछताछ नहीं की है। डीओ ब्लॉक देने का प्रयास मेरा अगला कदम होगा। – Stefan
हां, यह है। मैं एक ही मुद्दा था ..
हल करने के लिए, मैं एक सी # .net स्क्रिप्ट जो सभी plsql डेटाबेस चल और सभी मिलान की कमी से हटाया लिखना पड़ा ..
के लिए, कैसे एक को दूर करने के बारे में विशिष्ट जानकारी बाधाएं, पीएल लिंक का पालन करें। http://www.techonthenet.com/oracle/foreign_keys/drop.php
आप सभी NOT NULL
बाधाओं PostreSQL में आप इस सुविधा का उपयोग कर सकते हैं ड्रॉप करना चाहते हैं:
CREATE OR REPLACE FUNCTION dropNull(varchar) RETURNS integer AS $$
DECLARE
columnName varchar(50);
BEGIN
FOR columnName IN
select a.attname
from pg_catalog.pg_attribute a
where attrelid = $1::regclass
and a.attnum > 0
and not a.attisdropped
and a.attnotnull and a.attname not in(
SELECT
pg_attribute.attname
FROM pg_index, pg_class, pg_attribute
WHERE
pg_class.oid = $1::regclass AND
indrelid = pg_class.oid AND
pg_attribute.attrelid = pg_class.oid AND
pg_attribute.attnum = any(pg_index.indkey)
AND indisprimary)
LOOP
EXECUTE 'ALTER TABLE ' || $1 ||' ALTER COLUMN '||columnName||' DROP NOT NULL';
END LOOP;
RAISE NOTICE 'Done removing the NOT NULL Constraints for TABLE: %', $1;
RETURN 1;
END;
$$ LANGUAGE plpgsql;
कृपया ध्यान दें कि प्राथमिक कुंजी बाहर रखा जाएगा।
तो फिर तुम इसे का उपयोग कॉल कर सकते हैं:
चयन dropNull (TableName);
UPDATE pg_attribute SET attnotnull = FALSE WHERE attrelid = 'tbl_b'::regclass -- schema-qualify if needed! AND attnotnull AND NOT attisdropped AND attnum > 0;
शॉर्टकट आकर्षक है:
सुपर उपयोगकर्ता विशेषाधिकार के साथ एक त्वरित और गंदी तरह से नहीं है। लेकिन अगर आप इसे पेंच करते हैं तो आप अपने सिस्टम को तोड़ सकते हैं।
मूल नियम है: सिस्टम कैटलॉग के साथ सीधे छेड़छाड़ न करें। फिर भी बहुत तेजी से
DO
$$
BEGIN
EXECUTE (
SELECT 'ALTER TABLE tbl_b ALTER '
|| string_agg (quote_ident(attname), ' DROP NOT NULL, ALTER ')
|| ' DROP NOT NULL'
FROM pg_catalog.pg_attribute
WHERE attrelid = 'tbl_b'::regclass
AND attnotnull
AND NOT attisdropped
AND attnum > 0
);
END
$$
:
साफ रास्ता केवल नियमित रूप से विशेषाधिकार की आवश्यकता है तालिका को बदलने के लिए: एक DO
बयान में गतिशील एसक्यूएल के साथ स्वचालित रूप से (यह लागू करता what Denis already suggested)। गतिशील आदेशों के साथ सावधानी बरतें और एसक्यूएल इंजेक्शन से सावधान रहें।
यह इस बड़ी जवाब से एक स्पिन बंद है:
Generate DEFAULT values in a CTE UPSERT using PostgreSQL 9.3
वहाँ हम साथ बनाई गई एक मेज से नहीं NULL बाधाओं ड्रॉप करने की जरूरत है:
CREATE TABLE tbl_b (LIKE tbl_a INCLUDING DEFAULTS);
के बाद से, per documentation:
नॉन-बाधा बाधाओं को हमेशा नई तालिका में कॉपी किया जाता है।
वैकल्पिक तालिका तालिका_नाम ALTER COLUMN [सेट न्यूल | ड्रोप न्यूल]
यह देखने का प्रयास करें कि ये लिंक आपको इसे लागू करने के तरीके को समझने में मदद कर सकते हैं। http://stackoverflow.com/questions/3370159/how-to-remove-not-null-constraint-in-sql-server-using-query http://stackoverflow.com/questions/2540615/how-can-i -drop-a-not-null-constraint-in-oracle-when-i-dont-know-the-name-of-t- –