2009-02-04 7 views
180

मैं निम्न क्वेरी (इंटरनेट के लिए स्वच्छ) का उपयोग कर मेरी PostgreSQL डेटाबेस के लिए एक नया, "नहीं NULL" कॉलम शामिल कर रहा हूँ:मैं एक पोस्टग्रेस्क्ल डेटाबेस में एक कॉलम कैसे जोड़ सकता हूं जो नल की अनुमति नहीं देता है?

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

हर बार जब मैं इस क्वेरी चलाने, मैं निम्नलिखित त्रुटि संदेश मिलता है:

ERROR: column "mycolumn" contains null values 

मैं स्टंप्डया हूँ। मुझसे कहां गलती हो रही है?

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

उत्तर

305

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

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; 
+1

अच्छा समाधान। मैं इस कारण के लिए वाक्यविन्यास क्या होगा, यह देखने के लिए किसी कारण से ऑनलाइन पोस्टग्रेक्स दस्तावेज़ नहीं मिल सका। –

+3

@ सेनब्राइट, आप 'मैन ALTER_TABLE'' करके ऑफ़लाइन पोस्ट ऑफिस तक पहुंच सकते हैं :) –

+0

@ allan.simon मैंने पहले कभी पोस्टग्रेएसक्यूएल का उपयोग नहीं किया है और मैंने इसे कहीं भी इंस्टॉल नहीं किया है। –

47

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

+6

कैसे यह वास्तव में अच्छा हो गया होता करने के लिए का उदाहरण। अन्यथा, ल्यूक का समाधान अधिक पूर्ण और उपयोग करने के लिए तैयार प्रतीत होता है। –

+1

उदाहरण के लिए यह उत्तर देखें: http://stackoverflow.com/a/516016/32453 – rogerdpack

5

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

1

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

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

+3

मैंने -1 नहीं किया, लेकिन मुझे लगता है कि इसके साथ सूक्ष्म कठिनाइयां हो सकती हैं - उदा। मैं शर्त लगा रहा हूं कि मौजूदा सूचकांक, ट्रिगर्स और विचार मूल नाम को नाम के बाद भी जारी रखेंगे क्योंकि मुझे लगता है कि वे तालिका के विपरीत (जो नहीं बदलते हैं) को इसके नाम के बजाय स्टोर करते हैं। –

+1

हां, मुझे यह कहना चाहिए था कि नई तालिका मूल की एक सटीक प्रति होना चाहिए, जिसमें इंडेक्स और ऐसे शामिल हैं। बहुत संक्षिप्त होने के लिए मेरा बुरा। इसका कारण यह है कि एक टेबल पर एक अल्टर करने की सूक्ष्म diffculties भी हो सकता है, और कभी-कभी आपको इसे मंच करने की आवश्यकता होती है। – alphadogg

+0

उदाहरण के लिए, DEFAULT दृष्टिकोण का उपयोग करके, आप प्रत्येक पंक्ति में उस डिफ़ॉल्ट मान को जोड़ देंगे। यह सुनिश्चित करते समय पोस्टग्रेस टेबल को लॉक नहीं करता है। या, यदि कॉलम ऑर्डर महत्वपूर्ण है, तो आप ALTER कमांड के साथ केवल कॉलम नहीं जोड़ सकते हैं। – alphadogg

2

डिफ़ॉल्ट मान निर्दिष्ट करना भी काम करेगा, मान लें कि डिफ़ॉल्ट मान उचित है।

+1

जाने के लिए 5 और अधिक यह डिफ़ॉल्ट मान (उदाहरण के लिए) के साथ कॉलम बनाने के लिए संशोधित वाक्यविन्यास देने का उत्तर सुधार देगा। – hardmath

52

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

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; 
+1

एक लेनदेन में भी, न्यूल को तुरंत लागू किया जाता है, इसलिए पहले कॉलम जोड़ें, मान भरें, फिर न्यूल जोड़ें - जैसा कि यह उत्तर करता है। (पोस्टग्रेज़ 9.6 पर परीक्षण किया गया) –

0

इस क्वेरी ऑटो अपडेट करेगा nulls

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

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

ALTER TABLE your_table_name ADD COLUMN new_column_name int; 
+1

आपकी क्वेरी पर कोई 'शून्य नहीं' बाधा नहीं है। बेशक यह काम कर रहा है। – Sylvain

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

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