Aggiungi chiave esterna alla tabella esistente


324

Voglio aggiungere una chiave esterna a una tabella chiamata "katalog".

ALTER TABLE katalog 
ADD CONSTRAINT `fk_katalog_sprache` 
FOREIGN KEY (`Sprache`)
REFERENCES `Sprache` (`ID`)
ON DELETE SET NULL
ON UPDATE SET NULL;

Quando provo a fare questo, ricevo questo messaggio di errore:

Error Code: 1005. Can't create table 'mytable.#sql-7fb1_7d3a' (errno: 150)

Errore nello stato INNODB:

120405 14:02:57 Errore nel vincolo di chiave esterna della tabella mytable. # Sql-7fb1_7d3a:

FOREIGN KEY (`Sprache`)
REFERENCES `Sprache` (`ID`)
ON DELETE SET NULL
ON UPDATE SET NULL:
Cannot resolve table name close to:
(`ID`)
ON DELETE SET NULL
ON UPDATE SET NULL

Quando utilizzo questa query funziona, ma con un'azione "all'eliminazione" errata:

ALTER TABLE `katalog` 
ADD FOREIGN KEY (`Sprache` ) REFERENCES `sprache` (`ID` )

Entrambe le tabelle sono InnoDB ed entrambi i campi sono "INT (11) non null". Sto usando MySQL 5.1.61. Tentativo di eseguire questa query ALTER con MySQL Workbench (il più recente) su un MacBook Pro.

Tabella Crea istruzioni:

CREATE TABLE `katalog` (
`ID` int(11) unsigned NOT NULL AUTO_INCREMENT,
`Name` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
`AnzahlSeiten` int(4) unsigned NOT NULL,
`Sprache` int(11) NOT NULL,
PRIMARY KEY (`ID`),
UNIQUE KEY `katalogname_uq` (`Name`)
 ) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ROW_FORMAT=DYNAMIC$$

CREATE TABLE `sprache` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
 `Bezeichnung` varchar(45) NOT NULL,
 PRIMARY KEY (`ID`),
 UNIQUE KEY `Bezeichnung_UNIQUE` (`Bezeichnung`),
KEY `ix_sprache_id` (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8

1
Dal momento che non hai pubblicato l'output di SHOW CREATE TABLE, posso solo ma chiedere: il nome della colonna è davvero ID, maiuscolo?
NB

Bene, ora è più facile da individuare - katalogha int(11) unsigned. sprachenon ha la usignedparte, quindi due colonne non sono uguali.
NB

Vuoi dire, entrambi i campi primari devono avere lo stesso tipo di dati?
frgtv10,

2
Questo è il problema con il tuo progetto: in primo luogo, stai facendo riferimento a due auto_incrementcolonne che non vanno bene. Inoltre, il manuale di MySQL dice: Corresponding columns in the foreign key and the referenced key must have similar internal data types inside InnoDB so that they can be compared without a type conversion. 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.. Pertanto, sì, tipo di dati simile e lo stesso segno.
NB

2
Non sto facendo riferimento a due campi auto_increment. katalog.Sprache (non auto) -> sprache.ID (auto)
frgtv10

Risposte:


560

Per aggiungere una chiave esterna (grade_id) a una tabella esistente (utenti), attenersi alla seguente procedura:

ALTER TABLE users ADD grade_id SMALLINT UNSIGNED NOT NULL DEFAULT 0;
ALTER TABLE users ADD CONSTRAINT fk_grade_id FOREIGN KEY (grade_id) REFERENCES grades(id);

12
Le ragioni mi aiutano a capire e ricordare. Questo perché non è possibile aggiungere una chiave esterna a un campo senza segno, giusto?
PixMach,

8
@PixMach, la risposta è no. Puoi avere numeri interi firmati come chiavi esterne. Come NB ha notato sulla domanda, il tipo e il segno dei campi devono corrispondere. Pertanto, se la chiave primaria nella tabella di ricerca è UNSIGNED, anche il campo chiave esterna deve essere UNSIGNED. Se il campo chiave primaria è FIRMATO, anche il campo chiave esterna deve essere firmato. Pensala in questo modo: qualunque sia la colonna in una tabella definita come in SHOW CREATE TABLE, deve avere la stessa definizione nell'altra tabella.
Ben Keene,

1
Si noti che ciò potrebbe essere fatto anche con una singola query (potrebbe essere migliore in caso di errore, ecc.)
Stijn de Witt,

6
Ho dovuto eseguire "SET FOREIGN_KEY_CHECKS = 0;" prima di eseguire il comando ADD CONSTRAINT o SQL si lamenterebbe "Impossibile aggiungere o aggiornare una riga figlio: un vincolo di chiave esterna non riesce".
Erin Geyer,

2
Do Non basta eseguire "FOREIGN_KEY_CHECKS set = 0;" se viene visualizzato l'errore "un vincolo di chiave esterna non riesce", ovviamente si dispone di dati errati che è necessario correggere, altrimenti si avranno problemi più grandi lungo la linea.
MazeChaZer,

72

Usa semplicemente questa query, l'ho provata secondo il mio scenario e funziona bene

ALTER TABLE katalog ADD FOREIGN KEY (`Sprache`) REFERENCES Sprache(`ID`);

25

Semplici passi ...

ALTER TABLE t_name1 ADD FOREIGN KEY (column_name) REFERENCES t_name2(column_name)

15

controlla questo link. Mi ha aiutato con errno 150: http://verysimple.com/2006/10/22/mysql-error-number-1005-cant-create-table-mydbsql-328_45frm-errno-150/

Sulla cima della mia testa mi vengono in mente due cose.

  • L'indice della tua chiave esterna è un nome univoco nell'intero database (n. 3 nell'elenco)?
  • Stai tentando di impostare la tabella PK su NULL all'aggiornamento (n. 5 nell'elenco)?

Immagino che il problema sia con il set NULL in aggiornamento (se i miei cervelli non sono al contrario oggi come spesso lo sono ...).

Modifica: ho perso i commenti sul tuo post originale. Le colonne int senza segno / non senza segno potrebbero aver risolto il tuo caso. Spero che il mio link aiuti qualcuno nel pensiero futuro.


13
FOREIGN KEY (`Sprache`)
REFERENCES `Sprache` (`ID`)
ON DELETE SET NULL
ON UPDATE SET NULL;

Ma il tuo tavolo ha:

CREATE TABLE `katalog` (
`Sprache` int(11) NOT NULL,

Non può impostare la colonna Sprache su NULL perché è definita come NOT NULL.


5

MySQL eseguirà questa query:

ALTER TABLE `db`.`table1`
ADD COLUMN `col_table2_fk` INT UNSIGNED NULL,
ADD INDEX `col_table2_fk_idx` (`col_table2_fk` ASC),
ADD CONSTRAINT `col_table2_fk1`
FOREIGN KEY (`col_table2_fk`)
REFERENCES `db`.`table2` (`table2_id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;

Saluti!


5

Come risolvere Error Code: 1005. Can't create table 'mytable.#sql-7fb1_7d3a' (errno: 150) in mysql.

  1. modifica la tua tabella e aggiungi un indice ad essa ..

    ALTER TABLE users ADD INDEX index_name (index_column)
  2. Ora aggiungi il vincolo

    ALTER TABLE foreign_key_table
    ADD CONSTRAINT foreign_key_name FOREIGN KEY (foreign_key_column)
    REFERENCES primary_key_table (primary_key_column) ON DELETE NO ACTION
    ON UPDATE CASCADE;

Nota se non aggiungi un indice non funzionerà.

Dopo aver combattuto per circa 6 ore, ho trovato la soluzione che spero possa salvare un'anima.


4

Quando si aggiunge un vincolo di chiave esterna a una tabella utilizzando ALTER TABLE, ricordarsi di creare prima gli indici richiesti.

  1. Crea indice
  2. Modifica tabella

Ho creato l'indice per entrambi. Quando provo a correre ricevo lo stesso messaggio di errore di prima. Quando disconosco la parte "
all'eliminazione

@ frgtv10 è molto probabile che i dati delle tabelle siano in conflitto con "on delete".
Maksym Polshcha,

3

prova tutto in una query

  ALTER TABLE users ADD grade_id SMALLINT UNSIGNED NOT NULL DEFAULT 0,
      ADD CONSTRAINT fk_grade_id FOREIGN KEY (grade_id) REFERENCES grades(id);

0

ciò accade fondamentalmente perché i tuoi tavoli sono in due diversi set di caratteri. ad esempio una tabella creata in charset = utf-8 e altre tabelle viene creata in CHARSET = latin1, quindi si desidera poter aggiungere la chiave foriegn a queste tabelle. utilizzare lo stesso set di caratteri in entrambe le tabelle, quindi sarà possibile aggiungere chiavi foriegn. errore 1005 forzato vincolo chiave erroneamente formato può risolvere da questo


0

ho superato lo stesso problema. Nel mio caso la tabella ha già dei dati e in questa tabella c'erano delle chiavi che non erano presenti nella tabella di riferimento. Quindi ho dovuto eliminare queste righe che mancano di rispetto ai vincoli e tutto ha funzionato.


0

passaggio 1: eseguire questo script

SET FOREIGN_KEY_CHECKS=0;

passaggio 2: aggiungi colonna

ALTER TABLE mileage_unit ADD COLUMN COMPANY_ID BIGINT(20) NOT NULL

passaggio 3: aggiungere la chiave esterna alla colonna aggiunta

ALTER TABLE mileage_unit
ADD FOREIGN KEY (COMPANY_ID) REFERENCES company_mst(COMPANY_ID);

passaggio 4: eseguire questo script

SET FOREIGN_KEY_CHECKS=1;

-1
 ALTER TABLE TABLENAME ADD FOREIGN KEY (Column Name) REFERENCES TableName(column name)

Esempio:-

ALTER TABLE Department ADD FOREIGN KEY (EmployeeId) REFERENCES Employee(EmployeeId)

1
Per favore, aggiungi qualche spiegazione al tuo codice in modo che altri possano imparare da esso
Nico Haase,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.