Ich möchte einer Tabelle namens "katalog" einen Fremdschlüssel 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 dies versuche, wird folgende Fehlermeldung angezeigt:
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 sie, aber mit der falschen Aktion "Beim 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 verwende MySQL 5.1.61. Der Versuch, diese ALTER-Abfrage mit MySQL Workbench (neueste Version) auf einem MacBook Pro auszulösen.
Tabellenanweisungen 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
mysql
foreign-keys
frgtv10
quelle
quelle
SHOW CREATE TABLE
, kann ich nur fragen - ist der Spaltenname wirklich ID, in Großbuchstaben?katalog
hatint(11) unsigned
.sprache
hat dasusigned
Teil nicht, daher sind zwei Spalten nicht gleich.auto_increment
Spalten, was schlecht ist. Außerdem heißt es im MySQL-Handbuch :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.
. Daher ja, ähnlicher Datentyp und das gleiche Vorzeichen.Antworten:
Führen Sie die folgenden Schritte aus, um einer vorhandenen Tabelle (Benutzern) einen Fremdschlüssel (grade_id) hinzuzufügen:
quelle
Verwenden Sie einfach diese Abfrage, ich habe sie gemäß meinem Szenario ausprobiert und sie funktioniert gut
quelle
Einfache Schritte ...
quelle
Überprüfen Sie diesen Link. Es hat mir bei Errno 150 geholfen: http://verysimple.com/2006/10/22/mysql-error-number-1005-cant-create-table-mydbsql-328_45frm-errno-150/
Auf meinem Kopf fallen mir zwei Dinge ein.
Ich vermute, das Problem liegt bei der Einstellung NULL beim Update (wenn mein Gehirn heute nicht rückwärts läuft, wie es so oft der Fall ist ...).
Bearbeiten: Ich habe die Kommentare zu Ihrem ursprünglichen Beitrag verpasst. Int-Spalten ohne Vorzeichen / ohne Vorzeichen haben Ihren Fall möglicherweise gelöst. Hoffe mein Link hilft jemandem in der Zukunft zu denken.
quelle
Aber Ihr Tisch hat:
Es kann nicht die Spalte Sprache auf NULL gesetzt , weil es als NOT NULL definiert ist.
quelle
MySQL führt diese Abfrage aus:
Prost!
quelle
Wie repariert man
Error Code: 1005. Can't create table 'mytable.#sql-7fb1_7d3a' (errno: 150) in mysql.
Ändern Sie Ihre Tabelle und fügen Sie einen Index hinzu.
Fügen Sie nun die Einschränkung hinzu
Beachten Sie, dass es nicht funktioniert, wenn Sie keinen Index hinzufügen.
Nachdem ich ungefähr 6 Stunden damit gekämpft hatte, kam ich auf die Lösung, von der ich hoffe, dass sie eine Seele rettet.
quelle
Denken Sie beim Hinzufügen einer Fremdschlüsseleinschränkung zu einer Tabelle mit ALTER TABLE daran, zuerst die erforderlichen Indizes zu erstellen.
quelle
Versuchen Sie alles in einer Abfrage
quelle
Dies geschieht im Wesentlichen, weil sich Ihre Tabellen in zwei verschiedenen Zeichensätzen befinden. Als Beispiel wird eine Tabelle in charset = utf-8 und andere Tabellen in CHARSET = latin1 erstellt, damit Sie diesen Tabellen einen Foriegn-Schlüssel hinzufügen können. Verwenden Sie in beiden Tabellen den gleichen Zeichensatz, um weitere Schlüssel hinzuzufügen. Fehler 1005 falsch gebildete Schlüsselbeschränkung kann daraus behoben werden
quelle
Ich bin durch das gleiche Problem gekommen. In meinem Fall hat die Tabelle bereits Daten und es gab Schlüssel in dieser Tabelle, die nicht in der Referenztabelle vorhanden waren. Also musste ich diese Zeilen löschen, die die Einschränkungen nicht respektierten und alles funktionierte.
quelle
Schritt 1: Führen Sie dieses Skript aus
Schritt 2: Spalte hinzufügen
Schritt 3: Fügen Sie der hinzugefügten Spalte einen Fremdschlüssel hinzu
Schritt 4: Führen Sie dieses Skript aus
quelle
Beispiel:-
quelle