2012-06-15 11 views
14

जब मैं mysql में कोई तालिका बनाने का प्रयास करता हूं तो मुझे एक त्रुटि मिलती है।ERROR 1005 (HY000): तालिका नहीं बना सकता (errno: 150)

इसे हल करने पर कोई सुझाव?

create table stock_in(
    ind int not null auto_increment, 
    itemcode varchar(10) not null, 
    quantity int not null, 
    description text not null, 
    sales_ref int not null default -1, 
    return_outwards_ref int not null default -1, 
    stock_in_receipt_ref int not null default -1, 
    date text not null, 
    time text not null, 
    username text not null, 
    foreign key (sales_ref) references sales (receiptno), 
    foreign key (return_outwards_ref) references returnoutwards(ind), 
    primary key (ind) 
); 

त्रुटि:

ERROR 1005 (HY000): Can't create table 'posinventory.stock_in' (errno: 150) 
+0

क्या आपने अनन्य कुंजी के साथ 'बिक्री' और' वापसी-आउट' टेबल 'बनाई हैं? सभी टेबल InnoDb होना चाहिए। – Devart

+0

@Devart: धन्यवाद, मुझे मेरी गलती मिली ... ऐसा इसलिए है क्योंकि बिक्री तालिका में प्राप्तिनो प्राथमिक कुंजी नहीं है ... मुझे इसे प्राथमिक कुंजी के साथ एक नए कॉलम में संदर्भित करना चाहिए, उदाहरण के लिए, sales_no – Boon

उत्तर

25

चेक बाहर MySQL मैनुअल के बारे में foreign key constrains:

If you re-create a table that was dropped, it must have a definition that conforms to the foreign key constraints referencing it. It must have the right column names and types, and it must have indexes on the referenced keys, as stated earlier. If these are not satisfied, MySQL returns error number 1005 and refers to error 150 in the error message.

कुछ विचार:

  • बेहतर ड्रॉप टेबल और एक अच्छी तरह से गठित वाक्यविन्यास के साथ इसे नया बनाओ।
  • ENGINE=InnoDB; को अपने CREATE TABLE - कमांड में जोड़ना सुनिश्चित करें।
  • सुनिश्चित करें कि आपके MySQL सर्वर पर InnoDB सक्षम है। इसे सत्यापित करने के लिए, इस आदेश को आजमाएं: SHOW VARIABLES LIKE 'have_innodb'; - यदि यह एक YES देता है, तो InnoDB सक्षम है।
  • तालिका- और फ़ील्ड नामों में ऊपरी- और लोअरकेस के लिए अपना आदेश देखें।
  • इसे न केवल उस तालिका को देखें, जिसे आप बनाना चाहते हैं, लेकिन उन तालिकाओं पर भी जो विदेशी कुंजी का जिक्र कर रहे हैं।
  • सुनिश्चित करें कि आपकी निर्दिष्ट तालिकाएं ठीक से अनुक्रमित हैं।
+0

धन्यवाद, मैंने पाया मेरी गलती ... ऐसा इसलिए है क्योंकि बिक्री तालिका में receiptno प्राथमिक कुंजी नहीं है ...मुझे इसे प्राथमिक कुंजी के साथ एक नए कॉलम में संदर्भित करना चाहिए, उदाहरण के लिए, sales_no – Boon

+0

मुझे भी वही त्रुटि थी और जब मैंने प्राथमिक कुंजी पर पैरेंट टेबल को अनुक्रमित किया, तो त्रुटि हल हो गई। – sreeprasad

+2

मैं यह जोड़ना चाहता हूं कि अगर आप अपने एफके के साथ संदर्भित कर रहे किसी भी तालिका में एक ही इंजन नहीं हैं तो आपको संदेश मिल जाएगा; अच्छा, निश्चित रूप से अगर उनके InnoDB नहीं है। –

1

कारणों में से एक विदेशी कुंजी कॉलम डेटा प्रकार और लंबाई रेफरिंग टेबल कुंजी कॉलम के समान होना चाहिए। उदाहरण के लिए रेफरिंग टेबल कॉलम माध्यमिक (11) है और विदेशी कुंजी कॉलम int (11) का मतलब है कि विदेशी कुंजी के साथ तालिका बनाने के दौरान त्रुटि उत्पन्न होगी।

4

बिल्कुल वही समस्या थी। इसका स्रोत विदेशी कुंजी और संदर्भ के प्रकारों में है।

विदेशी कुंजी:

fer_id SMALLINT NOT NULL 

और मूल क्षेत्र (refernce जो हम प्रदान करने के लिए):

id INT(11) UNSIGNED NOT NULL 

मैं सिर्फ अहस्ताक्षरित रूप में अच्छी तरह fer_id INT (11) बनाने गए हैं। जादूगर काम करता है!

1

अन्य चीजों के शीर्ष पर, आपको यह सुनिश्चित करना होगा कि दोनों टेबल/फ़ील्ड CHARSET सेटिंग्स से मेल खाते हैं। एक यूटीएफ प्रकार का क्षेत्र 'लैटिन 1' से काफी अलग आकार हो सकता है। शो दोनों टेबल पर टेबल बनाएं अगर वहाँ एक बेमेल

1

है तुम्हें दिखाता आप अपने डेटाबेस का बैकअप आप अस्थायी रूप से अक्षम विदेशी कुंजी sql फ़ाइल की शुरुआत में इन तार डालने से जाँच कर सकते हैं बहाल हैं:

/*!40030 SET NAMES UTF8 */; 
/*!40101 SET @[email protected]@CHARACTER_SET_CLIENT */; 
/*!40101 SET @[email protected]@CHARACTER_SET_RESULTS */; 
/*!40101 SET @[email protected]@COLLATION_CONNECTION */; 
/*!40103 SET @[email protected]@TIME_ZONE */; 
/*!40103 SET TIME_ZONE='+00:00' */; 
/*!40014 SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; 
/*!40014 SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; 
/*!40101 SET @[email protected]@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; 
/*!40111 SET @[email protected]@SQL_NOTES, SQL_NOTES=0 */; 
संबंधित मुद्दे