2013-11-22 7 views
25

क्या एक टेबल से सभी नल बाधाओं को एक बार में छोड़ना संभव है?एक पोस्टग्रेएसक्यूएल तालिका से सभी नल बाधाओं को कैसे छोड़ें

मेरे पास बहुत सारी बाधाओं के साथ एक बड़ी मेज है और मैं ऐसे समाधान की तलाश कर रहा हूं जो उन्हें अलग से छोड़ने से तेज़ है।

+0

यह देखने का प्रयास करें कि ये लिंक आपको इसे लागू करने के तरीके को समझने में मदद कर सकते हैं। 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- –

उत्तर

47

आप कर सकते हैं समूह उन सब को एक ही बदलने बयान में:

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() का उपयोग करना भूल जाएं।

+1

आपकी क्वेरी बहुत बढ़िया है। मैंने कभी कैटलॉग पूछताछ नहीं की है। डीओ ब्लॉक देने का प्रयास मेरा अगला कदम होगा। – Stefan

0

हां, यह है। मैं एक ही मुद्दा था ..

हल करने के लिए, मैं एक सी # .net स्क्रिप्ट जो सभी plsql डेटाबेस चल और सभी मिलान की कमी से हटाया लिखना पड़ा ..

के लिए, कैसे एक को दूर करने के बारे में विशिष्ट जानकारी बाधाएं, पीएल लिंक का पालन करें। http://www.techonthenet.com/oracle/foreign_keys/drop.php

6

आप सभी 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; 

शॉर्टकट आकर्षक है:

3

सुपर उपयोगकर्ता विशेषाधिकार के साथ एक त्वरित और गंदी तरह से नहीं है। लेकिन अगर आप इसे पेंच करते हैं तो आप अपने सिस्टम को तोड़ सकते हैं।
मूल नियम है: सिस्टम कैटलॉग के साथ सीधे छेड़छाड़ न करें। फिर भी बहुत तेजी से

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:

नॉन-बाधा बाधाओं को हमेशा नई तालिका में कॉपी किया जाता है।

4

वैकल्पिक तालिका तालिका_नाम ALTER COLUMN [सेट न्यूल | ड्रोप न्यूल]

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

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