425 Stimmen

Fremdschlüssel zu vorhandener Tabelle hinzufügen

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 versuche, dies zu tun, erhalte ich diese Fehlermeldung:

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

Fehler in INNODB Status:

120405 14:02:57 Fehler in Fremdschlüssel-Beschrä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 sie, aber mit der falschen "on delete"-Aktion:

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

Beide Tabellen sind InnoDB und beide Felder sind "INT(11) not null". Ich verwende MySQL 5.1.61. Ich versuche, diese ALTER-Abfrage mit MySQL Workbench (neueste Version) auf einem MacBook Pro auszuführen.

Tabelle Anweisungen erstellen:

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

708voto

iltaf khalid Punkte 9340

Um einen Fremdschlüssel (grade_id) zu einer bestehenden Tabelle (users) hinzuzufügen, gehen Sie wie folgt vor:

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

95voto

SagarPPanchal Punkte 9212

Verwenden Sie einfach diese Abfrage, ich habe sie in meinem Szenario ausprobiert und sie funktioniert gut

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

44voto

Amjath Khan Punkte 511

Einfache Schritte...

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

19voto

Bill Punkte 181
FOREIGN KEY (`Sprache`)
REFERENCES `Sprache` (`ID`)
ON DELETE SET NULL
ON UPDATE SET NULL;

Aber Ihr Tisch schon:

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

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

16voto

ZZ-bb Punkte 2139

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

Da fallen mir spontan zwei Dinge ein.

  • Ist Ihr Fremdschlüsselindex ein eindeutiger Name in der gesamten Datenbank (Nr. 3 in der Liste)?
  • Versuchen Sie, die Tabelle PK bei der Aktualisierung auf NULL zu setzen (Nr. 5 in der Liste)?

Ich vermute, dass das Problem mit der Einstellung NULL beim Update zusammenhängt (falls mein Hirn heute nicht wie so oft auf dem Rückwärtsgang ist...).

Edit: Ich habe die Kommentare zu Ihrem ursprünglichen Beitrag übersehen. Vorzeichenlose/nicht vorzeichenlose int-Spalten haben Ihren Fall vielleicht gelöst. Hoffe, mein Link hilft jemand in der Zukunft gedacht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X