2013-07-17 11 views
23
CREATE DATABASE my_db; 

CREATE TABLE class (classID int NOT NULL AUTO_INCREMENT, 
nameClass varchar(255), 
classLeader varchar(255), 
FOREIGN KEY (classLeader) REFERENCES student(studentID), 
PRIMARY KEY (classID)); 

CREATE TABLE student (studentID int NOT NULL AUTO_INCREMENT, 
lastName varchar(255), 
firstName varchar(255), 
classID int, 
FOREIGN KEY (classID) REFERENCES class(classID), 
PRIMARY KEY (studentID)); 

मैं विदेशी कुंजी का उपयोग करके तालिकाओं के बीच डेटा स्थिरता बीमा करने की कोशिश कर रहा हूं ताकि डीबीएमएस त्रुटियों की जांच कर सके; हालांकि, ऐसा लगता है कि हम किसी कारण से ऐसा नहीं कर सकते हैं। क्या त्रुटि है और क्या कोई विकल्प है? साथ ही, जब मैं एक सारणी भरता हूं जिसमें एक विदेशी कुंजी है, तो मैं उस क्षेत्र को भर नहीं सकता जो विदेशी कुंजी के लिए आरक्षित है, है ना? साथ ही, क्या एक विदेशी कुंजी बिल्कुल महत्वपूर्ण मानी जाती है?त्रुटि कोड: 1215. विदेशी कुंजी बाधा (विदेशी कुंजी)

FOREIGN KEY (classLeader) REFERENCES student(studentID), 

classLeader की डेटाप्रकार VARCHAR (255) है:

उत्तर

35

सबसे अधिक संभावना इस मुद्दे को इस लाइन है। उसमें संदर्भित कॉलम के डेटाटाइप से मेल खाता है ... student.studentID। और निश्चित रूप से, student तालिका मौजूद है, और studentID कॉलम मौजूद होना है, और studentID कॉलम छात्र तालिका की प्राथमिक कुंजी होना चाहिए (हालांकि मुझे विश्वास है कि MySQL इसे प्राथमिक कुंजी की बजाय एक अद्वितीय कुंजी होने की अनुमति देता है , या यहाँ तक कि बस उस पर एक सूचकांक है।)

किसी भी मामले में, यहाँ क्या याद आ रही है से SHOW CREATE TABLE student;


वहाँ एक डेटाप्रकार बेमेल है उत्पादन होता है।

classLeader VARCHAR(255) कॉलम studentID INT पर विदेशी कुंजी संदर्भ नहीं हो सकता है।

दो स्तंभों के डेटाटाइप से मेल खाना पड़ेगा।

+0

डाटाबेस बनाएं my_db3; CREATE TABLE वर्ग (CLASSID नहीं NULL AUTO_INCREMENT int, nameClass varchar (255), classLeader पूर्णांक, विदेशी कुँजी (classLeader) दें संदर्भ छात्र (studentID), प्राथमिक कुंजी (ClassID)); शो टेबल छात्र बनाएँ (studentID पूर्णांक नहीं NULL AUTO_INCREMENT, lastName varchar (255), firstName varchar (255), CLASSID पूर्णांक, विदेशी कुँजी (ClassID) दें संदर्भ वर्ग (ClassID), प्राथमिक कुंजी (studentID)) ; –

+1

मुझे अभी भी एक त्रुटि मिल रही है। –

+0

@ GEORGEReed..यह उपयोगी होगा यदि आप जो त्रुटि प्राप्त कर रहे हैं उसे पोस्ट कर सकते हैं। – Rohan

7

आप studentID और classLeader की FOREIGN KEY (classLeader) REFERENCES student(studentID) में डेटाप्रकार की वजह से इस त्रुटि हो रही है प्राथमिक कुंजी स्तंभ और विदेशी कुंजी स्तंभ के different.Datatype ही होना चाहिए है।

From MySQL Site:

Corresponding columns in the foreign key and the referenced key must have similar data types. 
The size and sign of integer types must be the same. 
The length of string types need not be the same. 
For nonbinary (character) string columns, the character set and collation must be the same. 
+3

+1 यह प्रश्न का उत्तर देता है; यह उत्तर त्रुटि उत्पन्न करने वाली समस्या की पहचान करता है। – spencer7593

+0

मैं हस्ताक्षरित संपत्ति का उपयोग कर उन कॉलम जोड़ दूंगा जो इस त्रुटि का कारण बन सकते हैं। दोनों कॉलम में हस्ताक्षरित या हस्ताक्षरित की एक ही परिभाषा होनी चाहिए। –

1

त्रुटि का समाधान हो जाता है:

इस

CREATE TABLE USERS_SO (
    USERNAME VARCHAR(10) NOT NULL, 
    PASSWORD VARCHAR(32) NOT NULL, 
    ENABLED SMALLINT, 
    PRIMARY KEY (USERNAME) 
); 

नीचे कोड की तरह एक मेज के लिए एक विदेशी कुंजी बनाने के लिए काम करता है ठीक

CREATE TABLE AUTHORITIES_SO (
    USERNAME VARCHAR(10) NOT NULL, 
    AUTHORITY VARCHAR(10) NOT NULL, 
    FOREIGN KEY (USERNAME) REFERENCES USERS_SO(USERNAME) 
); 
0

सुनिश्चित करें कि आप एक हैडर और एसक्यूएल डंप में पाद लेख है अन्यथा आप जब डेटाबेस को बहाल त्रुटियों के सभी प्रकार देखेंगे बनाओ

हैडर नीचे कुछ ऐसा दिखाई देगा -:

/*!40101 SET @[email protected]@CHARACTER_SET_CLIENT */; 
/*!40101 SET @[email protected]@CHARACTER_SET_RESULTS */; 
/*!40101 SET @[email protected]@COLLATION_CONNECTION */; 
/*!40101 SET NAMES utf8 */; 
/*!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 */; 

और पाद नीचे कुछ ऐसा दिखाई देगा: -

/*!40111 SET [email protected]_SQL_NOTES */; 
/*!40101 SET [email protected]_SQL_MODE */; 
/*!40014 SET [email protected]_FOREIGN_KEY_CHECKS */; 
/*!40101 SET [email protected]_CHARACTER_SET_CLIENT */; 
/*!40101 SET [email protected]_CHARACTER_SET_RESULTS */; 
/*!40101 SET [email protected]_COLLATION_CONNECTION */; 

आशा है कि इसके बाद के संस्करण

चीयर्स में मदद करता है एस

0

कुंजी के अंत संदर्भ बिंदु सेट करें हालांकि यह देर से उत्तर है, मुझे आशा है कि इससे कुछ लोगों की मदद मिलेगी।

मुझे एक ही समस्या का सामना करना पड़ा। लेकिन, यहां डेटा प्रकार भी समान थे।

लेकिन, जब मैंने टेबल टेबल स्टेटमेंट की जांच की, तो मैंने पाया कि "आईआईएसएएमएएम" नामक इंजन का उपयोग करके बनाई गई एक तालिका और दूसरा "इनो डीबी" का उपयोग कर रहा था।

SHOW CREATE TABLE <TABLE NAME> 

तो मैं "InnoDB" करने के लिए दोनों तालिकाओं इंजन बदल गया और यह (मैं विदेशी कुंजी बनाने में सक्षम था)

0

क्वेरी से Engine, CHARSET, COLLATE निकालें, फिर चेकआउट काम किया। इससे मेरा काम बनता है।

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