2013-07-17 10 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)); 

Próbuję zapewnić spójność danych między tabelami za pomocą klucza obcego, aby system DBMS mógł sprawdzić błędy; wydaje się jednak, że nie możemy tego zrobić z jakiegoś powodu. Jaki jest błąd i czy istnieje alternatywa? Ponadto, gdy wypełniam tabelę z kluczem obcym, nie mogę wypełnić pola zarezerwowanego dla klucza obcego, prawda? Czy klucz obcy uważany jest za klucz?Kod błędu: 1215. Nie można dodać ograniczenia klucza obcego (klucze obce)

Odpowiedz

35

Najprawdopodobniej problemem jest to linia:

FOREIGN KEY (classLeader) REFERENCES student(studentID), 

Typ danych classLeader jest VARCHAR (255). To musi do pasuje do datatype z przywołanej kolumny ... student.studentID. Oczywiście musi istnieć tabela student, a kolumna studentID musi istnieć, a kolumna studentID powinna być KLUCZEM PODSTAWOWYM tabeli ucznia (chociaż uważam, że MySQL zezwala na to, że jest to KLUCZ UNIKALNY, a nie KLUCZ PODSTAWOWY lub nawet tylko mieć indeks na nim.)

W każdym razie, czego brakuje tutaj jest wyjście z SHOW CREATE TABLE student;


Istnieje niezgodność typu danych.

Kolumna classLeader VARCHAR(255) nie może być kluczem obcym odwołanie do studentID INT.

Typy danych obu kolumn muszą być zgodne.

+0

TWORZENIE BAZY DANYCH my_db3; TWORZENIE klasa tabeli (CLASSID int NOT NULL AUTO_INCREMENT, nameClass varchar (255), classLeader int, KLUCZOWE obcych (classLeader) odniesienia uczeń (studentID) PRIMARY KEY (CLASSID)); SHOW CREATE studenta tabeli (studentID int NOT NULL AUTO_INCREMENT, varchar lastName (255), varchar firstName (255), CLASSID int, KLUCZOWE obcych (CLASSID) odniesienia klasy (CLASSID) klucz podstawowy (studentID)) ; –

+1

Nadal dostaję błąd. –

+0

@ GEORGEReed..Jest przydatny, jeśli możesz opublikować błąd, który otrzymujesz. – Rohan

7

Otrzymujesz ten błąd ponieważ w FOREIGN KEY (classLeader) REFERENCES student(studentID) typ danych o studentID i classLeader jest different.Datatype od klucza podstawowego kolumny i kolumny klucza obcego musi być taka sama.

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 To odpowiada na pytanie; ta odpowiedź identyfikuje problem powodujący błąd. – spencer7593

+0

Dodam, że kolumny używające niepodpisanej właściwości również mogą powodować ten błąd. Obie kolumny muszą mieć taką samą definicję podpisu lub znaku unsigned. –

1

Błąd zostanie rozwiązany:

Aby utworzyć klucz obcy do tabeli jak to

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

Poniższy kod działa poprawnie

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

Upewnij się, że nagłówek i stopkę w SQL wysypisko inaczej widać wszelkiego rodzaju błędów podczas Przywracanie baz danych

Nagłówek powinien wyglądać jak poniżej -:

/*!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 */; 

i stopki powinien wyglądać jak poniżej -:

/*!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 */; 

Hope powyżej pozwala

CHEERS S

0

Ustaw końcowy punkt odniesienia klucza na "Unikatowy"

0

Chociaż jest to odpowiedź z opóźnieniem, mam nadzieję, że pomogłoby to niewielu osobom.

Zmierzyłem się z tym samym problemem. Ale tutaj typy danych również były takie same.

Ale, Kiedy sprawdziłem instrukcję tworzenia tabeli, stwierdziłem, że jedna tabela została utworzona przy użyciu silnika o nazwie "MyISAM", a inna używała "InnoDB".

SHOW CREATE TABLE <TABLE NAME> 

Potem zmieniłem silnik obu tabel do "InnoDB" i to działało (I był w stanie utworzyć klucz obcy)

0

Zdjąć Engine, CHARSET, COLLATE z Query, następnie kasę. Mi to pasuje.

Powiązane problemy