2012-11-04 13 views
9

संभव डुप्लिकेट:
Column ‘mary’ does not existPostgreSQL में स्ट्रिंग के लिए शाब्दिक 'एक्स' त्रुटि "स्तंभ 'एक्स' मौजूद नहीं है"

मैं मानों को स्वीकार किया जा सकता जाँच करने की जरूरत है चेक बाधा के माध्यम से एक कॉलम। मुझे चेक बाधा का उपयोग करने की ज़रूरत है, क्योंकि यह कॉलेज के असाइनमेंट के लिए है।

मैं बना सकते हैं और तालिका में बाधा जोड़ने के लिए इस कोड का उपयोग करें।

CREATE TABLE Ereignis(
    E_Id Serial PRIMARY KEY, 
    Typ varchar(15), 
    Zeitpunkt timestamp, 
    Ort varchar(32), 
    Anzahl_Pers int 
); 

ALTER TABLE Ereignis ADD 
CONSTRAINT typ_ch CHECK (Typ in (’Verkehrsunfall’, ’Hochwasser’, ’Sonstiges’)); 

यहाँ त्रुटि मैं मिलता है:

ERROR: column "’verkehrsunfall’" does not exist 

मैं यह त्रुटि यह verkehrsunfall स्तंभ के साथ कॉलम typ तुलना करने के लिए कोशिश करता है, जैसा कि मैंने मान उस स्तंभ कोशिश प्राप्त कर सकते हैं की जाँच करने की कोशिश जहां से मिल के रूप में ('Verkehrsunfall', 'होचवासेर', 'Sonstiges') तारों में से एक है।

यह बिल्कुल वैसा ही वाक्य रचना है जो हमारे व्याख्याता हमें व्याख्यान में पता चला है। मुझे यकीन नहीं है कि वर्चर्स की जांच के साथ तुलना करना संभव है? या मैं गलत क्या कर रहा हूँ?

यहाँ व्याख्यान से उदाहरण है:

CREATE TABLE Professoren 
(PersNr INTEGER PRIMARYKEY, 
Name VARCHAR(3 0) NOT NULL , 
Rang CHAR(2) CHECK (Rang in ('C2' ,'C3' ,'C4')) , 
Raum INTEGER UNIQUE) ; 
+0

क्या यह (http://stackoverflow.com/q/13196572/398670) एक ही पाठ्यक्रम सामग्री से है? समय ऐसा लगता है कि यह कुछ व्याख्याता हो सकता है जिसने एसक्यूएल को एक वर्ड प्रोसेसर में संपादित किया और इसे पीडीएफ या वेब पेज नोट्स के रूप में सौंप दिया जो छात्रों ने कॉपी और पेस्ट किया है ... –

+1

सिंटैक्स सही है यदि आप सही सिंगल कोट्स का उपयोग करते हैं: http://www.sqlfiddle.com/#!12/fb4ec –

+1

बस एक एफवाईआई आपका नामकरण सम्मेलन अच्छा नहीं है। या तो पहले_नाम जैसे स्कोर के तहत उपयोग करें या यदि आप जाना चाहते हैं कि कम आदर्श मार्ग आप "फर्स्टनाम" कर सकते हैं। राजधानियों और अंडरस्कोर मिश्रण और मैच मत करो। यह नामकरण करने के लिए सामान्य है, लेकिन पोस्टग्रेज़ के लिए विशिष्ट मैं अलग-अलग शब्दों के स्कोर के साथ रहूंगा और पूंजी अक्षरों का उपयोग नहीं करूंगा। – Kuberchaun

उत्तर

19

आपका पाठ संपादक या शब्द संसाधक तथाकथित स्मार्ट उद्धरणों उपयोग कर रहा है, , नहीं साधारण एकल उद्धरण की तरह, ' की तरह। अक्षर के लिए सामान्य एकल उद्धरण (वास्तव में apostrophes) ' का उपयोग करें, या पहचानकर्ताओं के लिए " डबल कोट्स का उपयोग करें। आपके पास कुछ अजीब कॉमा भी हैं जो सिंटैक्स त्रुटियों का कारण बन सकते हैं। the PostgreSQL manual on SQL syntax देखें, specicifically lexical structure

किसी वर्ड प्रोसेसर में एसक्यूएल (या किसी अन्य स्रोत कोड) संपादित न करें। एक सभ्य पाठ संपादक जैसे Notepad++, बीबीईडिट, विम, इत्यादि, इस तरह आपके एसक्यूएल को उलझन में नहीं रखेंगे।

सही उदाहरण:

CREATE TABLE Professoren 
(PersNr INTEGER PRIMARYKEY, 
Name VARCHAR(30) NOT NULL, 
Rang CHAR(2) CHECK (Rang in ('C2' ,'C3' ,'C4')), 
Raum INTEGER UNIQUE); 

कारण यह एक एकमुश्त सिंटैक्स त्रुटि का कारण नहीं है - और इसके बजाय आप स्तंभ मौजूदा नहीं के बारे में एक अजीब त्रुटि संदेश देता है - क्योंकि PostgreSQL यूनिकोड स्तंभ नाम स्वीकार करता है और मानता है है एक पहचानकर्ता के लिए एक पूरी तरह से मान्य चरित्र चरित्र। का निरीक्षण करें:

regress=> SELECT 'dummy text' AS won’t, 'dummy2' as ’alias’; 
    won’t | ’alias’ 
------------+--------- 
dummy text | dummy2 
(1 row) 

इस प्रकार, यदि आप test नाम के एक स्तंभ है और आप ’test’ नामित स्तंभ के लिए पूछना, PostgreSQL सही ढंग से आपको बता देंगे कोई स्तंभ ’test’ नामित नहीं है। आपके मामले में आप ’verkehrsunfall’ नामक कॉलम के लिए पूछ रहे हैं, जब आप शाब्दिक स्ट्रिंग Verkehrsunfall का उपयोग करना चाहते थे, इसलिए त्रुटि संदेश कहता है कि कॉलम ’verkehrsunfall’ बाहर नहीं निकलता है।

यदि यह एक वास्तविक एकल उद्धरण, जो अमान्य वाक्य रचना होगी थे। पहला psql में निष्पादित नहीं होगा क्योंकि इसमें एक संलग्न एकल उद्धरण होगा; 2 की तरह कुछ के साथ विफल हो जाएगा:

regress=> SELECT 'dummy2' as 'alias'; 
ERROR: syntax error at or near "'alias'" 
LINE 1: SELECT 'dummy2' as 'alias'; 

...क्योंकि एएनएसआई एसक्यूएल में, वह पहचानकर्ता के रूप में एक शाब्दिक उपयोग करने की कोशिश कर रहा है। सही सिंटैक्स या पहचानकर्ता के लिए डबल उद्धरण बिल्कुल कोट के बगैर होगा:

regress=> SELECT 'dummy2' as "alias", 'dummy3' AS alias; 
alias | alias 
--------+-------- 
dummy2 | dummy3 
(1 row) 

तुम भी varchar typmod में एक अवांछित जगह है; varchar(3 0) अमान्य है:

regress=> SELECT 'x'::varchar(3 0); 
ERROR: syntax error at or near "0" 
LINE 1: SELECT 'x'::varchar(3 0); 

Btw, PostgreSQL में यह आम तौर पर बेहतर varchar के बजाय एक text कॉलम का उपयोग करना है। यदि आप एप्लिकेशन या सत्यापन कारणों के लिए लंबाई बाधा चाहते हैं, तो length(colname) पर एक चेक बाधा जोड़ें।

+0

बहुत बहुत धन्यवाद, इस तरह के एक छोटे से विवरण मुझे एहसास नहीं होगा कि वे 2 अलग ASCII कोड के अनुरूप हैं। –

+0

@ लुइसियस रुतिलियस लूपस बस एक नाइट-पिक: वे वास्तव में ASCII दोनों नहीं हैं। एक एकल उद्धरण (एस्ट्रोफ़े, वास्तव में) है, लेकिन '' '' '' '' 'है जो ASCII रेंज में नहीं है। वे निश्चित रूप से अलग-अलग वर्ण कोड या यूनिकोड कोड-पॉइंट हैं। –

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