2016-02-27 9 views
28

पर विदेशी कुंजी कॉलम जोड़ना मेरे पास links_chatpicmessage नामक एक पोस्टग्रेस्क्ल तालिका है जहां मैं एक कॉलम जोड़ने की कोशिश कर रहा हूं जो auth_user नामक किसी अन्य तालिका में एक विदेशी कुंजी है। इस कॉलम को sender कहा जाएगा।postgresql तालिका

ALTER TABLE links_chatpicmessage ADD FOREIGN KEY (sender) REFERENCES auth_user;

लेकिन यह मुझे एक त्रुटि देता है:

ERROR: column "sender" referenced in foreign key constraint does not exist

मैं इसे कैसे ठीक करूं

ऊपर प्राप्त करने के लिए, मैं टर्मिनल पर निम्नलिखित कोशिश कर रहा हूँ?

उत्तर

42

कॉलम में बाधा जोड़ने के लिए इसे पहले तालिका में मौजूद होना चाहिए पोस्टग्रेस्क्ल में कोई कमांड नहीं है जिसका उपयोग आप कर सकते हैं जो कॉलम जोड़ देगा और एक ही समय में बाधा डाल देगा। यह दो अलग-अलग आदेश होना चाहिए। आप निम्न कमांड का प्रयोग यह कर सकते हैं:

पहले के रूप में कार्य करें:

ALTER TABLE links_chatpicmessage ADD COLUMN sender INTEGER; 

मैं यहाँ प्रकार के रूप में integer का उपयोग, लेकिन यह auth_user तालिका के id स्तंभ के एक ही प्रकार होना चाहिए।

तो फिर तुम बाधा जोड़ने

ALTER TABLE links_chatpicmessage 
    ADD CONSTRAINT fk_someName 
    FOREIGN KEY (sender) 
    REFERENCES auth_user(column_referenced_name); 

इस आदेश की ADD CONSTRAINT fk_someName हिस्सा अपने बाधा नामकरण इसलिए यदि आप अपने मॉडल बनाने के कुछ उपकरण के साथ यह दस्तावेज़ करने की आवश्यकता पर बाद आप एक नामित बाधा होगा एक यादृच्छिक नाम के बजाय।

यह प्रशासकों के उद्देश्यों के लिए भी कार्य करता है इसलिए एक डीबीए जानता है कि उस तालिका से बाधा है।

आमतौर पर हम इसे इस बात के बारे में कुछ संकेत देते हैं कि यह कहां से आया है, जहां यह आपके मामले पर संदर्भित होगा, यह fk_links_chatpicmessage_auth_user होगा, इसलिए इस नाम को देखने वाले किसी भी व्यक्ति को यह पता चल जाएगा कि यह बाधा INFORMATION_SCHEMA पर जटिल क्वेरी के बिना क्या है ।

संपादित

@ btubbs के द्वारा उल्लेख किया है कि आप वास्तव में एक आदेश में एक बाधा के साथ एक स्तंभ जोड़ सकते हैं जवाब। इसलिए जैसा:

alter table links_chatpicmessage 
     add column sender integer, 
     add constraint fk_test 
     foreign key (sender) 
     references auth_user (id); 
+1

हाय @HassanBaig मैं अपनी पोस्ट संपादित करेंगे प्रत्येक भाग की व्याख्या करने के

मैं इस वाक्य रचना का उपयोग करें। –

+0

मैं देखता हूं। स्पष्टीकरण के लिए +1। मुझे इसे –

+0

आज़माएं, इसलिए मैंने कोशिश की कि 'वैकल्पिक तालिका लिंक_चैटपिकमेजेज कंसस्ट्रेंट जोड़ें fk_links_chatpicmessage_auth_user विदेशी कुंजी (प्रेषक) संदर्भ auth_user (आईडी);' लेकिन मुझे अभी भी 'कुंजी कॉलम" संदर्भित है जो विदेशी कुंजी बाधा में संदर्भित नहीं है। मुझे लगता है कि मैं कुछ मौलिक याद कर रहा हूँ? –

27

आप एक पंक्ति में Postgres में ऐसा कर सकते हैं:

ALTER TABLE links_chatpicmessage ADD COLUMN sender INTEGER REFERENCES auth_user (id); 

आप मैन्युअल रूप से एक नाम निर्धारित करने की आवश्यकता नहीं है। Postgres स्वचालित रूप से इस बाधा "link_chatpicmessage_auth_user_id_fkey" नाम देंगे।

4

मैं जानता हूँ कि क्या यह उत्तर रास्ता देर हो चुकी है, और मुझे लगता है यह एक ही है एक लाइनर, बस थोड़ी और वर्णनात्मक btubbs के रूप में ...

मान लिया जाये कि आप तालिका auth_user में और कहा कि प्राथमिक कुंजी का संदर्भ लेना चाहते मुख्य नाम 'आईडी' है।

ALTER TABLE links_chatpicmessage 
ADD COLUMN sender some_type, 
ADD FOREIGN KEY (sender) REFERENCES auth_user(id); 

नोट:: some_type = [तालिका auth_user में प्रेषक के समान टाइप]