database - एक विदेशी कुंजी के रूप में एक स्तंभ जोड़ने से विदेशी कुंजी में संदर्भित ERROR स्तंभ मौजूद नहीं है




postgresql foreign-keys (4)

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

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

आपको मैन्युअल रूप से नाम सेट करने की आवश्यकता नहीं है। पोस्टग्रैट्स स्वचालित रूप से इस बाधा का नाम "लिंक_चैटपेसमेजेज_ऑथ_सियर_आईडी_फेक" देगा।

मेरे पास निम्नलिखित सेट अप हैं,

CREATE TABLE auth_user ( id int PRIMARY KEY );
CREATE TABLE links_chatpicmessage ();

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

उपरोक्त प्राप्त करने के लिए, मैं टर्मिनल पर निम्नलिखित प्रयास कर रहा हूं:

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

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

त्रुटि: स्तंभ "प्रेषक" विदेशी कुंजी बाधा में संदर्भित नहीं होता है

मैं यह कैसे तय करुं?


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

पहले के रूप में करते हैं:

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 हिस्सा आपके अवरोध का नाम दे रहा है, इसलिए यदि आपको बाद में इसे किसी ऐसे उपकरण के साथ प्रलेखित करने की आवश्यकता है जो आपका मॉडल बनाता है तो आपके पास एक यादृच्छिक नाम के बजाय एक नामित बाधा होगी।

इसके अलावा यह प्रशासकों के उद्देश्यों को पूरा करता है इसलिए A DBA को पता है कि बाधा उस तालिका से है।

आमतौर पर हम इसे कुछ संकेत के साथ नाम देते हैं कि यह कहां से आया है जहां यह आपके मामले पर संदर्भ देता है, यह 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);

मौजूदा कॉलम के लिए **** विदेशी कुंजी संदर्भ ****

सारणी तालिका_नाम ADD CONSTRAINT fkey_name FOREIGN KEY (आईडी) संदर्भ संसाधन ref_table (आईडी)


CONSTRAINT क्लॉज वैकल्पिक है। मैं यह सुझाव देता हूं कि इसे हमेशा के लिए छोड़ दें और हमेशा PostgreSQL को कसौटी पर खरा उतरने दें, इसका नाम लिए बिना आपको तार्किक नाम मिलेगा

"links_chatpicmessage_sender_fkey" FOREIGN KEY (sender) REFERENCES auth_user(id)

यही कारण है कि यदि कोई बाधा या उल्लंघन के कारण INSERT या UPDATE विफल रहता है, तो आप जानना चाहेंगे।

एक विदेशी कुंजी जोड़ने के लिए सिंटैक्स

इन सभी को कुछ हद तक ALTER TABLE

एक नए स्तंभ के लिए

ALTER TABLE links_chatpicmessage 
  ADD COLUMN sender int,
  ADD [CONSTRAINT foo] FOREIGN KEY (sender) REFERENCES auth_user(id);

यह यौगिक और लेन-देन है। आप एक साथ दो बयानों को अलग करके एक ही टेबल पर दो ALTER स्टेटमेंट जारी कर सकते हैं।

एक स्तंभकार स्तंभ के लिए

-- assumes someone has already added the column or that it already exists
ALTER TABLE links_chatpicmessage
  ADD COLUMN sender int;

ALTER TABLE links_chatpicmessage
  ADD [CONSTRAINT foo] FOREIGN KEY (sender) REFERENCES auth_user(id);





alter-table