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

Sto cercando di assicurare la coerenza dei dati tra le tabelle utilizzando chiave esterna in modo che il DBMS può controllare per eventuali errori; tuttavia, sembra che non possiamo farlo per qualche motivo. Qual è l'errore e c'è un'alternativa? Inoltre, quando riempio una tabella con una chiave esterna, non riesco a compilare il campo riservato alle chiavi esterne, giusto? Inoltre, una chiave straniera è considerata una chiave?errore: 1215. Impossibile aggiungere vincolo di chiave esterna (chiavi esterne)

risposta

35

La più probabile problema è questa linea:

FOREIGN KEY (classLeader) REFERENCES student(studentID), 

il tipo di dati classLeader è VARCHAR (255). Questo deve corrispondere al tipo di dati della colonna di riferimento ... student.studentID. E, naturalmente, la tabella student deve esistere e la colonna studentID deve esistere e la colonna studentID deve essere la CHIAVE PRIMARIA della tabella degli studenti (anche se credo che MySQL consenta che questa sia una CHIAVE UNICA, piuttosto che una CHIAVE PRIMARIA , o anche solo avere un indice su esso.)

In ogni caso, ciò che manca qui è l'uscita dal SHOW CREATE TABLE student;


C'è una mancata corrispondenza tipo di dati.

La colonna classLeader VARCHAR(255) non può essere un riferimento a chiave esterna a studentID INT.

I tipi di dati delle due colonne devono corrispondere.

+0

CREATE DATABASE my_db3; CREATE TABLE classe (classid int NOT NULL AUTO_INCREMENT, nameClass varchar (255), classLeader int, FOREIGN KEY (classLeader) RIFERIMENTI studente (studentID), PRIMARY KEY (classid)); SHOW CREATE studente TABLE (studentID int NOT AUTO_INCREMENT NULL, lastName varchar (255), firstName varchar (255), ClassID int, FOREIGN KEY (classid) riferimenti alle classi (classid), PRIMARY KEY (studentID)) ; –

+1

Ricevo ancora un errore. –

+0

@ GEORGEReed ... Sarebbe utile se è possibile pubblicare un errore. – Rohan

7

State ottenendo questo errore a causa di in FOREIGN KEY (classLeader) REFERENCES student(studentID) tipo di dati studentID e classLeader è different.Datatype della colonna di chiave primaria e la colonna chiave esterna deve essere lo stesso.

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 Questo risponde alla domanda; questa risposta identifica il problema che causa l'errore. – spencer7593

+0

Vorrei aggiungere che le colonne che utilizzano la proprietà senza segno possono anche causare questo errore. Entrambe le colonne devono avere la stessa definizione di firmata o non firmata. –

1

L'errore viene risolto:

Per creare una chiave esterna per una tabella come questa

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

Il seguente codice funziona bene

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

Assicurarsi di avere un'intestazione e piè di pagina in discarica SQL altrimenti vedrete tutti i tipi di errori durante il ripristino del database

intestazione dovrebbe essere simile di seguito -:

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

e piè di pagina dovrebbe essere simile di seguito -:

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

Sperare gli aiuti sopra

Acclamazioni S

0

Impostare il punto di riferimento finale della chiave su "Univoco"

0

Anche se è una risposta tardiva, spero che possa aiutare poche persone.

Ho affrontato lo stesso problema. Ma, qui i tipi di dati erano uguali.

Ma, quando ho controllato l'istruzione create table, ho trovato che una tabella creata usando un motore chiamato "MyISAM" e un'altra stava usando "InnoDB".

SHOW CREATE TABLE <TABLE NAME> 

poi ho cambiato motore di entrambe le tabelle a "InnoDB" e ha funzionato (sono stato in grado di creare la chiave esterna)

0

Rimuovere il Engine, CHARSET, COLLATE da Query, quindi checkout. Per me funziona.

Problemi correlati