2013-11-23 5 views
10

मैं अपने सिस्टम के लिए डेटाबेस और टेबल बनाने की कोशिश कर रहा हूं। लेकिन मैंने पाया कि अगर मैं कोड में विदेशी कुंजी नहीं जोड़ता हूं। कोई त्रुटि नहीं है मैंने कोड बनाने के लिए कई तरीकों का प्रयास किया है, लेकिन इसमें अभी भी त्रुटि है।MySQL विदेशी कुंजी, तालिका नहीं बना सकता (errno: 150)

मैं MySQL 5.5.31, और यहाँ कोड का उपयोग कर रहा हूँ: डेटाबेस टीओएस बनाएं;

DROP TABLE TOS.USER CASCADE; 
DROP TABLE TOS.BILL_HEADER CASCADE; 
DROP TABLE TOS.TOY CASCADE; 


CREATE TABLE TOS.USER 
(User Char(8), 
Name Char(10), 
Type Char(1), 
Password Char(12), 
PRIMARY KEY(User)); 

CREATE TABLE TOS.BILL_HEADER 
(Bill_No Char(10), 
CTime DateTime, 
No_Of INTEGER, 
Cus_No Char(5), 
DTime DateTime, 
PRIMARY KEY(Bill_No)); 

CREATE TABLE TOS.TOY 
(Toy_Id Char(10), 
FullN Char(50), 
ShortN Char(20), 
Descrip Char(20), 
Price DECIMAL, 
Avail Char(1), 
Cat Char(1), 
PRIMARY KEY(Toy_Id)); 

CREATE TABLE TOS.BILL_ITEM 
(Bill_No Char(10), 
BSeq_No INTEGER, 
Toy_Id Char(10), 
OTime DateTime, 
Quan INT, 
DCondition Char(1), 
PRIMARY KEY(Bill_No,BSeq_No), 
FOREIGN KEY(Bill_No) REFERENCES TOS.Bill_Header(Bill_No), 
FOREIGN KEY(Toy_Id) REFERENCES TOS.TOY(Toy_Id)); 

त्रुटि:

1005 - Can't create table 'TOS.BILL_ITEM' (errno: 150)

किसी भी मदद की बहुत सराहना की जाएगी।

+0

यदि मैं 'DROP' कथन हटा देता हूं तो यह काम करता प्रतीत होता है .. http://sqlfiddle.com/#!2/08d1e –

+2

आमतौर पर, डेटा प्रकार और लम्बाई मेल नहीं होने के कारण 150 में एक विदेशी कुंजी त्रुटि होती है कॉलम और रिलेशनशिप या प्राथमिक कॉलम पर लापता इंडेक्स के बीच। आपके पास सभी सही प्रकार और पीके इंडेक्स परिभाषित किए गए हैं। –

+0

क्या आप समस्या को कम करने के लिए केवल विदेशी कुंजी को हटाने का प्रयास कर सकते हैं? –

उत्तर

17

गैर descript त्रुटि 150 आमतौर पर विदेशी कुंजी डेटा प्रकार या लंबाई बेमेल, या माता-पिता तालिका की स्तंभ पर एक लापता सूचकांक से संबंधित है।

यह तालिका तालिका नाम Bill_Header (BILL_HEADER होना चाहिए) में केस संवेदनशीलता का मामला होना चाहिए।
From the MySQL docs on identifier case sensitivity:

In MySQL, databases correspond to directories within the data directory. Each table within a database corresponds to at least one file within the database directory (and possibly more, depending on the storage engine). Consequently, the case sensitivity of the underlying operating system plays a part in the case sensitivity of database and table names. This means database and table names are not case sensitive in Windows, and case sensitive in most varieties of Unix.

मामले को ठीक करें और यह काम करना चाहिए:

CREATE TABLE TOS.BILL_ITEM 
(Bill_No Char(10), 
BSeq_No INTEGER, 
Toy_Id Char(10), 
OTime DateTime, 
Quan INT, 
DCondition Char(1), 
PRIMARY KEY(Bill_No,BSeq_No), 
FOREIGN KEY(Bill_No) REFERENCES TOS.BILL_HEADER(Bill_No), 
# Here-----------------------------^^^^^^^^^^^^^^ 
FOREIGN KEY(Toy_Id) REFERENCES TOS.TOY(Toy_Id)); 

के बाद से अपने कोड के रूप में काम SQLFiddle.com पर है (http://sqlfiddle.com/#!2/08d1e) अंतर्निहित मंच वहाँ केस-संवेदी नहीं होना चाहिए।

+0

धन्यवाद, यह काम करता है! आपका बहुत बहुत धन्यवाद। – Confucius

+3

मेरे मामले में माता-पिता और बाल तालिका के बीच फ़ील्ड कोलेट विसंगति थी। – Serge

+1

एक और सूक्ष्म मुद्दा यह है कि चरित्र सेट से मेल खाना चाहिए। मैं बस उसमें भाग गया जहां मैं जिस तालिका का संदर्भ दे रहा था वह utf8 था, लेकिन यह लैटिन -1 टेबल पर एक नई बाधा उत्पन्न करने की कोशिश कर रहा था। एक बार जब मैंने निर्माण तालिका में ut8 निर्दिष्ट किया तो सब ठीक था। – Felix

5

जवाब से ऊपर सही है, लेकिन इस त्रुटि भी यदि तालिका अपने विदेशी कुंजी संदर्भित कर रहा है InnoDB के बजाय MyISAM है हो सकता है।

+0

पर बनाम अहस्ताक्षरित बेमेल पर हस्ताक्षर किए के लिए जाँच या अगर माता-पिता की मेज एक डिफ़ॉल्ट CHARSET निर्दिष्ट है और बच्चे की मेज या तो यह निर्दिष्ट या एक अलग डिफ़ॉल्ट CHARSET निर्दिष्ट करता है नहीं है। –

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