Ich muss eine Datenbank mit zwei Tabellen in MySQL erstellen, aber das Skript schlägt mit Errno 150 (Fremdschlüsselproblem) fehl. Ich habe überprüft, ob die Fremdschlüsselfelder in beiden Tabellen gleich sind, und kann keinen Fehler finden.
Hier ist das Skript:
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';
DROP SCHEMA IF EXISTS `testdb`;
CREATE SCHEMA IF NOT EXISTS `testdb` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
USE `testdb`;
DROP TABLE IF EXISTS `testdb`.`table1` ;
CREATE TABLE IF NOT EXISTS `testdb`.`table1` (
`id` INT UNSIGNED NOT NULL ,
`field1` VARCHAR(50) NULL ,
PRIMARY KEY (`id`) )
ENGINE = InnoDB;
DROP TABLE IF EXISTS `testdb`.`table2` ;
CREATE TABLE IF NOT EXISTS `testdb`.`table2` (
`id` INT NOT NULL AUTO_INCREMENT ,
`field1` VARCHAR(50) NULL ,
`date` DATE NULL ,
`cnt` INT NULL ,
PRIMARY KEY (`id`) ,
INDEX `FK_table2_table1` (`field1` ASC) ,
CONSTRAINT `FK_table2_table1`
FOREIGN KEY (`field1`)
REFERENCES `testdb`.`table1` (`field1` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
Ich habe es in Windows und Ubuntu mit verschiedenen Versionen von MySQL versucht und es hat nicht funktioniert.
Irgendwelche Ideen?
mysql
mysql-error-1005
David Espart
quelle
quelle
Antworten:
table1.field1
Es ist kein Index definiert.Es ist erforderlich, eine
FOREIGN KEY
Einschränkung festzulegenfield1
.Mit diesem:
CREATE TABLE IF NOT EXISTS `testdb`.`table1` ( `id` INT UNSIGNED NOT NULL , `field1` VARCHAR(50) NULL , KEY ix_table1_field1 (field1), PRIMARY KEY (`id`) ) ENGINE = InnoDB;
Alles sollte dann wie erwartet funktionieren.
quelle
Bei der Arbeit mit MySQL Workbench und MySQL 5.5.27 bin ich auf ein ähnliches Problem gestoßen. In meinem Fall gab es Probleme mit Feldern vom Typ INT. In einer Tabelle war es fälschlicherweise INT UNSIGNED und in der Referenzierungstabelle war es INT.
quelle
Abhängig von der Version von MySQL müssen Sie möglicherweise zuerst einen Index für table1.field1 erstellen.
quelle
Eine der Antworten hier schlägt vor, die Integritätsprüfung für Fremdschlüssel zu deaktivieren. Das ist eine schlechte Idee. Hier gibt es zwei wahrscheinliche Schuldige:
quelle
Ein weiterer Hinweis:
Selbst wenn Ihre Datentypen gleich zu sein scheinen - in meinem Fall beide Spalten
VARCHAR(50)
-, reicht dies nicht aus.Sie müssen auch sicherstellen, dass beide Spalten gleich sind
COLLATION
.quelle
Noch eine andere Ursache, obwohl sie anderen etwas ähnlich ist: Ich bezog mich auf eine Tabelle, die anstelle von InnoDB die MyISAM-Engine enthielt.
quelle
MySQL löst diesen Fehler auch aus, wenn Sie den Namen der verweisenden Tabelle falsch eingeben. Ich zog mir eine Weile die Haare aus, bis mir klar wurde, dass ich einen Brief verpasst hatte
foreign key (column1) references mistyped_table(column1)
quelle
FOREIGN KEY (user_id) REFERENCES user(id) ON DELETE CASCADE
, aber dieuser
Tabelle hat kein Feldid
- es wurde aufgerufenuser_id
! Also habe ich mich oben geändertuser(id)
zuuser(user_id)
, und alles war gut im Universum wieder ... für jetzt.Eine Option (je nach Fall) wäre das Deaktivieren der MySQL-Integritätsprüfung:
SET FOREIGN_KEY_CHECKS = 0;
quelle
Wenn nichts funktioniert, versuchen Sie Folgendes:
Der Fremdschlüsselname ist ein Duplikat eines bereits vorhandenen Schlüssels. Überprüfen Sie, ob der Name Ihres Fremdschlüssels in Ihrer Datenbank eindeutig ist. Fügen Sie einfach ein paar zufällige Zeichen am Ende Ihres Schlüsselnamens hinzu, um dies zu testen.
quelle
Ich habe diesen Fehler erhalten, als ich versucht habe, mit einem Fremdschlüssel auf ein nicht eindeutiges Feld zu verweisen. (was anscheinend nicht erlaubt ist)
quelle
In meinem Fall verwendete eine Tabelle Fremdschlüsseleinschränkungen für eine andere Tabelle, die noch nicht vorhanden war. Dies geschah aufgrund eines großen Makefiles, daher war es nicht so offensichtlich, wie ich es erwartet hätte.
quelle
Falls jemand immer noch Probleme damit hat, habe ich alle oben genannten Lösungen ausprobiert (außer SET FOREIGN_KEY_CHECKS) und nichts hat funktioniert. Das Problem war, dass beim Verweisen auf die erste Tabelle bei einigen Datenbanken die Tabellennamen zwischen Groß- und Kleinschreibung unterschieden werden. Ich finde das komisch, da ich das noch nie bei MySQL, Oracle gesehen habe und jetzt bei MariaDB.
Zum Beispiel:
Tabelle erstellen, falls nicht vorhanden CADASTRO_MAQUINAS (ID VARCHAR (16), Primärschlüssel (ID));
Tabelle erstellen, falls nicht vorhanden INFOS (Id_Maquina VARCHAR (16) NOT NULL, CONSTRAINT FK_infos_cadastro_maquinas Fremdschlüssel (Id_Maquina) verweist auf CADASTRO_MAQUINAS (Id));
Wenn ich versuche, die zweite Tabelle mit cadastro_maquinas (Kleinbuchstaben) anstelle von CADASTRO_MAQUINAS zu erstellen, wird dieser Fehler angezeigt.
quelle
Ich habe benutzt
MySQL workBench
. Das Problem ist, dass Sie nicht dasselbe verwenden könnenforeign key name
, es muss seinunique
. Wenn also mehr als eine Tabelle auf denselben Fremdschlüssel verweist, muss jedes Mal einunique
Name angegeben werden.quelle
Ich hatte einen ähnlichen Fehler an einer meiner Tabellen. Wenn diese Option aktiviert war, war die Spaltenkollatierung unterschiedlich, wodurch beide Spalten auf denselben Sortierungstyp geändert wurden.
Nachdem Sie den größten Teil der hier vorgeschlagenen Lösung gelesen haben. Ich dachte nur, es könnte hilfreich sein, wenn ich nur alle Möglichkeiten aufführe, die diesen Fehler auslösen könnten.
1, CASE der Spalte 2 prüfen, COLLATION of Columns 3 prüfen, In beiden Tabellen einen Schlüssel für die Spalte erstellen (Unique, Primary)
quelle
In meinem Fall habe ich die alte Tabellendefinition MyISAM in einer der Tabellen erhalten und konnte offensichtlich keinen Fremdschlüssel aus einer anderen Tabelle erstellen. Vielleicht hilft das jemandem.
Dies kann also aufgrund von Inkonsistenzen zwischen zwei Datenbanken / Felddefinitionen passieren, die zu überprüfen versuchen:
quelle
Für mich war das Problem die Verwendung
CONSTRAINT
in derCREATE TABLE
Abfrage.quelle
Möglicherweise tritt der gleiche Fehler auch auf, wenn Sie versuchen, auf einen zusammengesetzten Schlüssel in Ihrem Fremdschlüssel zu verweisen.
Zum Beispiel:
CREATE TABLE `article` ( `id` int(10) unsigned NOT NULL, `type` enum('X','Y','Z') NOT NULL, PRIMARY KEY (`id`,`type`) ) ENGINE InnoDB; CREATE TABLE `t1` ( `user_id` int(10) unsigned NOT NULL, `type` enum('X','Y','Z') NOT NULL, `article_id` int(10) unsigned NOT NULL, CONSTRAINT `user_access_article_ibfk_2` FOREIGN KEY (`article_id`, `type`) REFERENCES `article` (`id`, `type`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB
In diesem Fall ist es wichtig, article_id und type field in der FK-Definition in derselben Reihenfolge zu verwenden, in der sie in der PRIMARY KEY-Definition der Artikeltabelle angezeigt werden.
quelle
In meinem Fall war wahrscheinlich ein Serverfehler beim Löschen einer Tabelle mit demselben Namen. Das Problem wurde behoben, indem das gesamte Shcema gelöscht und neu erstellt wurde.
quelle
In sehr seltsamen Fällen kann Ihre Datenbank beschädigt sein. In meinem Fall hatte ich keine Fremdschlüssel auf dem Tisch und das einzige Umbenennen der Tabelle oder das Ändern der Engine half.
Es stellte sich heraus, dass innoDB defekt war, siehe: /dba/86853/1025-error-on-rename-of-table-errno-150-table-was-deleted-while-tried-to- a? lq = 1
quelle
Wenn Sie an der MySQL-Workbench arbeiten und diesen Fehler für eine Beziehungstabelle erhalten, gibt es möglicherweise eine schnelle Lösung für Sie: Löschen Sie sie einfach und lassen Sie die MySQL-Workbench sie für Sie neu erstellen. Dann kopieren Sie die SQL. Mein Errno 150 Problem wurde behoben.
quelle
Als ich dieses Problem hatte, lag es daran, dass ich die ID in der ersten Tabelle so festgelegt hatte,
unsigned
während dies bei dem Fremdschlüssel in der zweiten Tabelle nicht der Fall war. Beide habenunsigned
es für mich repariert.quelle
Erstellen Sie immer zuerst Master- / Parent-Tabellen und dann Ihre Detail- / Child-Tabellen.
quelle