2012-04-29 17 views
12
की ओर जाता है

प्रश्न:

जब एक विदेशी कुंजी बाधा के साथ एक मेज को बदलने की कोशिश त्रुटियां क्यों मिल रहा है?फेरबदल MySQL तालिका त्रुटियों

विवरण:

मैं 1 टेबल, HSTORY जो मैं अन्य सभी विशिष्ट इतिहास तालिकाओं (। यानी USER_HISTORY, BROWSER_HISTORY, PICTURE_HISTORY ...) के लिए एक आधार तालिका के रूप में उपयोग किया है। मैंने PICTURE और USER टेबल भी शामिल किए हैं, जिन्हें वे भी कहते हैं।

इतिहास तालिका:

CREATE TABLE IF NOT EXISTS HISTORY 
(
    ID  INT NOT NULL AUTO_INCREMENT, 
    VIEWERID INT NOT NULL , 
    VIEWDATE TIMESTAMP NOT NULL DEFAULT NOW(), 

    PRIMARY KEY (ID), 
    FOREIGN KEY (VIEWERID) REFERENCES USER(ID) 
) 
engine=innodb; 

उपयोगकर्ता तालिका: (मामले में किसी को भी उत्सुक है)

CREATE TABLE IF NOT EXISTS USER 
(
    ID  INT NOT NULL AUTO_INCREMENT, 

    PRIMARY KEY (ID) 
) 
engine=innodb; 

चित्र तालिका: (मामले में किसी को भी उत्सुक है)

CREATE TABLE IF NOT EXISTS PICTURE 
(
    ID  INT NOT NULL AUTO_INCREMENT, 

    PRIMARY KEY (ID) 
) 
engine=innodb; 

PICTURE_HISTORY तालिका:

CREATE TABLE IF NOT EXISTS PICTURE_HISTORY LIKE HISTORY; 

ALTER TABLE PICTURE_HISTORY 
ADD FOREIGN KEY (FOREIGNID) REFERENCES PICTURE(ID); 

हालांकि, जब मैं यह कर, मैं:

Key column 'FOREIGNID' doesn't exist in table 

मैं इस लेने का मतलब मैं पहली बार FOREIGNID बनाने होंगे, लेकिन उदाहरण के कई में एसओ पर, उपर्युक्त काम करना चाहिए। किसी को पता है कि यह क्यों हो रहा है?

+1

मैं एक उदाहरण है जहां देखना चाहते हैं जो काम करना चाहिए ... यह तब तक काम नहीं करेगा जब तक कि 'FOREIGNID' पहले से मौजूद न हो। आप इसे उपयोग करने वाली बाधा उत्पन्न करके केवल कॉलम नहीं बना सकते हैं। –

+0

@ माइकल मुझे दो बदले वक्तव्य जारी करना होगा (एक 'FOREGINID' बनाने के लिए और दूसरा इसे एक विदेशी कुंजी बनाने के लिए' या क्या मैं इसे एक बार में कर सकता हूं? – puk

+0

वास्तव में यह सुनिश्चित नहीं है - मैंने कभी कोशिश नहीं की है इसलिए मैं नहीं करता अगर आप एक कथन का प्रयास करते हैं तो यह शिकायत करेगा कि अगर यह एक कथन का प्रयास करता है तो बस शिकायत करें: 'वैकल्पिक तालिका चित्र' विदेशी मुद्रा में शामिल नहीं किया गया है जो कि कंटेंट नहीं किया गया है fk_pictureid फॉरवर्ड कुंजी (FOREIGNID) संदर्भ चित्र (आईडी); ' –

उत्तर

23

मेरी गलती को इंगित करने के लिए Michael पर धन्यवाद। जब तक कॉलम पहले से मौजूद नहीं है तब तक मैं वास्तव में एक विदेशी कुंजी नहीं बना सकता। यदि इसके बजाय मैं इन दो आदेश जारी, विदेशी कुंजी बाधा बन जाता है:

ALTER TABLE PICTURE_HISTORY 
ADD COLUMN FOREIGNID INT NOT NULL; 

ALTER TABLE PICTURE_HISTORY 
ADD FOREIGN KEY (FOREIGNID) REFERENCES PICTURE(ID); 
8

आप आदेशों mysql के लिए एक अल्पविराम का उपयोग कर, इसलिए जैसे गठजोड़ कर सकते हैं:

ALTER TABLE PICTURE_HISTORY 
ADD COLUMN FOREIGNID INT NOT NULL, 
ADD FOREIGN KEY (FOREIGNID) REFERENCES PICTURE(ID); 
+0

हालांकि तकनीकी रूप से उत्तर नहीं है मेरा मूल प्रश्न, फिर भी टिप के लिए धन्यवाद – puk

+0

तालिका कक्षों को बदलने के लिए कॉलम उत्पादक int शून्य नहीं है, कैस्केड हटाए जाने पर विदेशी कुंजी (उत्पादक) संदर्भ स्टॉक (productid) जोड़ें); यह काम नहीं किया। – VijayaRagavan

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