Fügen Sie der vorhandenen Tabelle Fremdschlüssel hinzu

Ich möchte einen Fremdschlüssel zu einer Tabelle namens “katalog” hinzufügen.

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

Wenn ich das versuche, erhalte ich folgende Fehlermeldung:

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

Fehler im INNODB-Status:

120405 14:02:57 Fehler in der Fremdschlüsseleinschränkung der Tabelle 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 

Wenn ich diese Abfrage verwende, funktioniert es, aber mit der falschen Aktion “zum Löschen”:

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

Beide Tabellen sind InnoDB und beide Felder sind “INT (11) not null”. Ich benutze MySQL 5.1.61. Versuchen, diese ALTER-Abfrage mit MySQL Workbench (neuestes) auf einem MacBook Pro auszulösen.

Tabellenerstellungsanweisungen:

 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 

Führen Sie die folgenden Schritte aus, um einer vorhandenen Tabelle (Benutzer) einen Fremdschlüssel (grade_id) hinzuzufügen:

 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); 

Verwenden Sie einfach diese Abfrage, ich habe es nach meinem Szenario versucht und es funktioniert gut

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

Überprüfen Sie diesen Link. Es hat mir mit errno 150 geholfen: http://verysimple.com/2006/10/22/mysql-error-number-1005-cant-create-table-mydbsql-328_45frm-errno-150/

Auf meinem Kopf kommen mir zwei Dinge in den Sinn.

  • Ist Ihr Fremdschlüssel-Index ein eindeutiger Name in der gesamten database (# 3 in der Liste)?
  • Versuchen Sie, die Tabelle PK bei Aktualisierung auf NULL zu setzen (# 5 in der Liste)?

Ich vermute das Problem ist mit dem Set NULL on update (wenn mein Gehirn heute nicht rückwärts läuft wie sie so oft sind …).

Edit: Ich habe die Kommentare zu Ihrem ursprünglichen Beitrag verpasst. Vorzeichenlose / nicht vorzeichenlose int Spalten können Ihren Fall lösen. Hoffe, mein Link hilft jemandem in der Zukunft zu denken.

Einfache Schritte …

 ALTER TABLE t_name1 ADD FOREIGN KEY (column_name) REFERENCES t_name2(column_name) 
 FOREIGN KEY (`Sprache`) REFERENCES `Sprache` (`ID`) ON DELETE SET NULL ON UPDATE SET NULL; 

Aber dein Tisch hat:

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

Es kann die Spalte Sprache nicht auf NULL setzen, da es als NOT NULL definiert ist.

Wenn Sie mithilfe von ALTER TABLE eine Fremdschlüsseleinschränkung zu einer Tabelle hinzufügen, denken Sie daran, zuerst die erforderlichen Indizes zu erstellen.

  1. Index erstellen
  2. Alter Tisch

MySQL wird diese Abfrage ausführen:

 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; 

Prost!

versuche alles in einer Abfrage

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