मैं Postgresql डेटाबेस में एक कॉलम कैसे जोड़ सकता हूं जो नल की अनुमति नहीं देता है?




alter-table (6)

आपको एक डिफ़ॉल्ट मान सेट करना होगा।

ALTER TABLE mytable ADD COLUMN mycolumn character varying(50) NOT NULL DEFAULT 'foo';

... some work (set real values as you want)...

ALTER TABLE mytable ALTER COLUMN mycolumn DROP DEFAULT;

मैं निम्नलिखित प्रश्न (इंटरनेट के लिए sanitized) का उपयोग कर अपने Postgresql डेटाबेस में एक नया, "नहीं पूर्ण" कॉलम जोड़ रहा हूं:

ALTER TABLE mytable ADD COLUMN mycolumn character varying(50) NOT NULL;

प्रत्येक बार जब मैं यह क्वेरी चलाता हूं, तो मुझे निम्न त्रुटि संदेश प्राप्त होता है:

ERROR:  column "mycolumn" contains null values

मैं उलझन में हूं। मुझसे कहां गलती हो रही है?

नोट: मैं मुख्य रूप से pgAdmin III (1.8.4) का उपयोग कर रहा हूं, लेकिन जब मैंने टर्मिनल के भीतर से SQL चलाया तो मुझे वही त्रुटि मिली।


आपको या तो डिफ़ॉल्ट को परिभाषित करने की आवश्यकता है, या जो शॉन कहता है वह करें और बिना किसी बाधा के इसे जोड़ें जब तक आप इसे मौजूदा पंक्तियों में भर नहीं देते।


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


जैसा कि अन्य ने देखा है, आपको या तो एक शून्य कॉलम बनाना होगा या एक डिफॉल्ट मान प्रदान करना होगा। यदि वह पर्याप्त लचीला नहीं है (उदाहरण के लिए यदि आपको किसी भी तरह से प्रत्येक पंक्ति के लिए गणना के लिए नए मान की आवश्यकता है), तो आप इस तथ्य का उपयोग कर सकते हैं कि PostgreSQL में, सभी डीडीएल आदेशों को लेनदेन के अंदर निष्पादित किया जा सकता है:

BEGIN;
ALTER TABLE mytable ADD COLUMN mycolumn character varying(50);
UPDATE mytable SET mycolumn = timeofday();    -- Just a silly example
ALTER TABLE mytable ALTER COLUMN mycolumn SET NOT NULL;
COMMIT;

यह मेरे लिए काम किया: :)

ALTER TABLE your_table_name ADD COLUMN new_column_name int;

या, अतिरिक्त कॉलम के साथ अस्थायी रूप में एक नई तालिका बनाएं, इस नई तालिका में डेटा को प्रतिलिपि बनाते समय इसे गैर-शून्य करने योग्य नए कॉलम को भरने के लिए जरूरी बनाते हैं, और फिर तालिका को दो-चरणीय नाम परिवर्तन के माध्यम से स्वैप करें।

हां, यह अधिक जटिल है, लेकिन यदि आप लाइव टेबल पर बड़ा अपडेट नहीं करना चाहते हैं तो आपको इसे ऐसा करने की आवश्यकता हो सकती है।





alter-table