MySQL: ERRORE 1215 (HY000): imansible aggiungere un vincolo di chiave esterna

Ho letto i concetti di sistema del Database , 6a edizione, Silberschatz . Ho intenzione di implementare il sistema di database universitario mostrato nel capitolo 2 su OS X su MySQL. Ma ho un problema con la creazione del course tavolo. sembra il department tavolo

 mysql> select * from department -> ; +------------+----------+-----------+ | dept_name | building | budget | +------------+----------+-----------+ | Biology | Watson | 90000.00 | | Comp. Sci. | Taylor | 100000.00 | | Elec. Eng. | Taylor | 85000.00 | | Finance | Painter | 120000.00 | | History | Painter | 50000.00 | | Music | Packard | 80000.00 | | Physics | Watson | 70000.00 | +------------+----------+-----------+ mysql> show columns from department -> ; +-----------+---------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+---------------+------+-----+---------+-------+ | dept_name | varchar(20) | NO | PRI | | | | building | varchar(15) | YES | | NULL | | | budget | decimal(12,2) | YES | | NULL | | +-----------+---------------+------+-----+---------+-------+ 

La creazione della course della tabella causa il seguente errore.

 mysql> create table course -> (course_id varchar(7), -> title varchar (50), -> dept_name varchar(20), -> credits numeric(2,0), -> primary key(course_id), -> foreign key (dept_name) references department); ERROR 1215 (HY000): Cannot add foreign key constraint 

dopo aver cercato google per il vincolo di chiave esterna, ho appena appreso che la parola ‘vincolo di chiave esterna’ indica che i dati dalla colonna chiave esterna nel course della tabella devono esistere nella colonna chiave primaria nel department tabella. Ma avrei dovuto incontrare questo errore durante l’inserimento dei dati.

In caso contrario, perché l’autore mi fa eseguire questa istruzione SQL?

Se dept_name realmente un’istruzione SQL errata, Devo designare dept_name nella tabella del corso come chiave esterna dopo aver inserito alcuni dati?

EDIT : digitare set foreign_key_checks=0 in mysql> non corregge l’errore.

 ------------------------ LATEST FOREIGN KEY ERROR ------------------------ 2013-09-21 16:02:20 132cbe000 Error in foreign key constraint of table university/course: foreign key (dept_name) references department): Syntax error close to: ) mysql> set foreign_key_checks=0 -> ; Query OK, 0 rows affected (0.00 sec) mysql> create table course -> (course_id varchar(7), -> title varchar(50), -> dept_name varchar(20), -> credits numeric(2,0), -> primary key(course_id), -> foreign key (dept_name) references department); ERROR 1215 (HY000): Cannot add foreign key constraint 

La syntax di FOREIGN KEY per CREATE TABLE è strutturata come segue:

 FOREIGN KEY (index_col_name) REFERENCES table_name (index_col_name,...) 

Quindi il tuo DDL MySQL dovrebbe essere:

  create table course ( course_id varchar(7), title varchar(50), dept_name varchar(20), credits numeric(2 , 0 ), primary key (course_id), FOREIGN KEY (dept_name) REFERENCES department (dept_name) ); 

Inoltre, department tabella dei department dept_name dovrebbe essere VARCHAR(20)

Ulteriori informazioni possono essere trovate nella documentazione di MySQL

Quando si ottiene questo messaggio di errore vago, è ansible scoprire l’errore più specifico eseguendo

 SHOW ENGINE INNODB STATUS; 

I motivi più comuni sono che quando si crea una chiave esterna, sia il campo di riferimento sia il campo della chiave esterna devono corrispondere:

  • Il motore dovrebbe essere lo stesso, ad esempio InnoDB
  • Il tipo di dati dovrebbe essere lo stesso e con la stessa lunghezza.
    eg VARCHAR (20) o INT (10) UNSIGNED
  • La collazione dovrebbe essere la stessa. es. utf8
  • Unico : la chiave esterna deve fare riferimento al campo che è univoco (di solito privato) nella tabella di riferimento.

Un’altra causa di questo errore è:
Hai definito una condizione SET NULL anche se alcune colonne sono definite come NOT NULL.

Forse le dept_name colonne dept_name hanno diversi set di caratteri.

Potresti provare a modificare uno o entrambi:

 ALTER TABLE department MODIFY dept_name VARCHAR(20) CHARACTER SET utf8; ALTER TABLE course MODIFY dept_name VARCHAR(20) CHARACTER SET utf8; 
 foreign key (dept_name) references department 

Questa syntax non è valida per MySQL. Dovrebbe invece essere:

 foreign key (dept_name) references department(dept_name) 

MySQL richiede che dept_name venga utilizzato due volte . Una volta per definire la colonna straniera e una volta per definire la colonna principale.

13.1.17.2. Utilizzo dei vincoli KEY FOREIGN

… [la] syntax essenziale per una definizione del vincolo di chiave esterna in una istruzione CREATE TABLE o ALTER TABLE è simile a questa:

 [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name, ...) REFERENCES tbl_name (index_col_name, ...) [ON DELETE reference_option] [ON UPDATE reference_option] reference_option: RESTRICT | CASCADE | SET NULL | NO ACTION 

È anche ansible ottenere questo errore se la chiave esterna non è una chiave primaria all’interno della propria tabella.

Ho fatto un ALTER TABLE e ho rimosso per errore lo stato della chiave primaria di una colonna e ho ricevuto questo errore.

ERRORE 1215 (HY000): imansible aggiungere un vincolo di chiave esterna

Vale anche la pena notare che si ottiene questo errore quando il tipo della colonna che è una chiave esterna in un’altra in grado non corrisponde esplicitamente alla colonna nella tabella corretta.

Per esempio:

 alter table schoolPersons add index FKEF5AB5E532C8FBFA (student_id), add constraint FKEF5AB5E532C8FBFA foreign key (student_id) references student (id); ERROR 1215 (HY000): Cannot add foreign key constraint 

Questo perché il campo student_id stato definito come:

 mysql> desc schoolPersons; +--------------------+------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------------------+------------+------+-----+---------+----------------+ | student_id | bigint(20) | YES | | NULL | | 

mentre il campo id nella tabella dello student stato definito come:

 mysql> desc persons; +--------------+----------------------+------+-----+-------------------+-----------------+ | Field | Type | Null | Key | Default | Extra | +--------------+----------------------+------+-----+-------------------+-----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | 

Il bigint(20) (generato da Java long by hibernate) non è compatibile con int(10) unsigned (Java int ).

Sotto il codice ha funzionato per me

 set @@foreign_key_checks=0; ALTER TABLE `table1` ADD CONSTRAINT `table1_fk1` FOREIGN KEY (`coloumn`) REFERENCES `table2` (`id`) ON DELETE CASCADE; 

Vale la pena notare che questo errore può verificarsi anche se la tabella o colonna di destinazione che si sta utilizzando nella parte REFERENCES semplicemente non esiste.

Basta aggiungere ‘unsigned’ per il vincolo FOREIGN

 `FK` int(11) unsigned DEFAULT NULL, 

Non incontro il problema come te. Ma ricevo lo stesso messaggio ERRORE. Quindi lo segnalo qui per la convenienza degli altri.

Controlla il set di caratteri di due tabelle se il tipo di colonna è char o varchar . Uso un charset=gbk , ma creo una nuova tabella il cui charset=utf8 predefinito charset=utf8 . Quindi il charset non è lo stesso.

 ERROR 1215 (HY000): Cannot add foreign key constraint 

Per risolverlo è usare lo stesso set di caratteri. Ad esempio utf8 .

Non vedo nessuno che lo dichiari esplicitamente e ho avuto lo stesso messaggio di errore e il mio problema era che stavo cercando di aggiungere una chiave esterna a una tabella TEMPORARY. Che non è consentito come indicato nel manuale

Le relazioni con le chiavi esterne coinvolgono una tabella padre che contiene i valori dei dati centrali e una tabella figlio con valori identici che risalgono al suo genitore. La clausola FOREIGN KEY è specificata nella tabella figlio. Le tabelle padre e figlio devono utilizzare lo stesso motore di archiviazione. Non devono essere tavoli TEMPORANEA.

(sottolineatura mia)

Mi sono imbattuto nello stesso problema pure. Non sei sicuro del motivo per cui funziona, ma funziona davvero: prova ad aggiungere ENGINE INNODB dopo aver creato la query.

 mysql> create table course -> (course_id varchar(7), -> title varchar (50), -> dept_name varchar(20), -> credits numeric(2,0), -> primary key(course_id), -> foreign key (dept_name) references department) ENGINE INNODB; 
 CONSTRAINT vendor_tbfk_1 FOREIGN KEY (V_CODE) REFERENCES vendor (V_CODE) ON UPDATE CASCADE 

questo è come potrebbe essere … guarda la parte della colonna di riferimento. (V_code)