wake-up-neo.com

MySQL "ERROR 1005 (HY000): Die Tabelle 'foo' kann nicht erstellt werden. # Sql-12c_4 '(Fehlernummer: 150)"

Ich habe an der Erstellung einiger Tabellen in der Datenbank foo gearbeitet, aber jedes Mal, wenn ich mit errno 150 ende bin, was den Fremdschlüssel angeht. Zunächst einmal mein Code zum Erstellen von Tabellen:

CREATE TABLE Clients
(
client_id                CHAR(10)  NOT NULL ,
client_name              CHAR(50)  NOT NULL ,
provisional_license_num  CHAR(50)  NOT NULL ,
client_address           CHAR(50)  NULL ,
client_city              CHAR(50)  NULL ,
client_county            CHAR(50)  NULL ,
client_Zip               CHAR(10)  NULL ,
client_phone             INT       NULL ,
client_email             CHAR(255) NULL ,
client_dob               DATETIME  NULL ,
test_attempts            INT       NULL
);
CREATE TABLE Applications
(
application_id   CHAR(10) NOT NULL ,
office_id        INT      NOT NULL ,
client_id        CHAR(10) NOT NULL ,
instructor_id    CHAR(10) NOT NULL ,
car_id           CHAR(10) NOT NULL ,
application_date DATETIME NULL 
);
CREATE TABLE Instructors
(
instructor_id      CHAR(10)  NOT NULL ,
office_id          INT       NOT NULL ,
instructor_name    CHAR(50)  NOT NULL ,
instructor_address CHAR(50)  NULL ,
instructor_city    CHAR(50)  NULL ,
instructor_county  CHAR(50)  NULL ,
instructor_Zip     CHAR(10)  NULL ,
instructor_phone   INT       NULL ,
instructor_email   CHAR(255) NULL ,
instructor_dob     DATETIME  NULL ,
lessons_given      INT       NULL 
);
CREATE TABLE Cars
(
car_id             CHAR(10) NOT NULL ,
office_id          INT      NOT NULL ,
engine_serial_num  CHAR(10) NULL ,
registration_num   CHAR(10) NULL ,
car_make           CHAR(50) NULL ,
car_model          CHAR(50) NULL 
);
CREATE TABLE Offices
(
office_id       INT       NOT NULL ,
office_address  CHAR(50)  NULL ,
office_city     CHAR(50)  NULL ,
office_County   CHAR(50)  NULL ,
office_Zip      CHAR(10)  NULL ,
office_phone    INT       NULL ,
office_email    CHAR(255) NULL 
);
CREATE TABLE Lessons
(
lesson_num     INT            NOT NULL ,
client_id      CHAR(10)       NOT NULL ,
date           DATETIME       NOT NULL ,
time           DATETIME       NOT NULL ,
milegage_used  DECIMAL(5, 2)  NULL ,
progress       CHAR(50)       NULL 
);
CREATE TABLE DrivingTests
(
test_num     INT       NOT NULL ,
client_id    CHAR(10)  NOT NULL ,
test_date    DATETIME  NOT NULL ,
seat_num     INT       NOT NULL ,
score        INT       NULL ,
test_notes   CHAR(255) NULL 
);

ALTER TABLE Clients ADD PRIMARY KEY (client_id);
ALTER TABLE Applications ADD PRIMARY KEY (application_id);
ALTER TABLE Instructors ADD PRIMARY KEY (instructor_id);
ALTER TABLE Offices ADD PRIMARY KEY (office_id);
ALTER TABLE Lessons ADD PRIMARY KEY (lesson_num);
ALTER TABLE DrivingTests ADD PRIMARY KEY (test_num);
ALTER TABLE Applications ADD CONSTRAINT FK_Applications_Offices FOREIGN KEY (office_id) REFERENCES Offices (office_id);
ALTER TABLE Applications ADD CONSTRAINT FK_Applications_Clients FOREIGN KEY (client_id) REFERENCES Clients (client_id);
ALTER TABLE Applications ADD CONSTRAINT FK_Applications_Instructors FOREIGN KEY (instructor_id) REFERENCES Instructors (instructor_id);
ALTER TABLE Applications ADD CONSTRAINT FK_Applications_Cars FOREIGN KEY (car_id) REFERENCES Cars (car_id);
ALTER TABLE Lessons ADD CONSTRAINT FK_Lessons_Clients FOREIGN KEY (client_id) REFERENCES Clients (client_id);
ALTER TABLE Cars ADD CONSTRAINT FK_Cars_Offices FOREIGN KEY (office_id) REFERENCES Offices (office_id);
ALTER TABLE Clients ADD CONSTRAINT FK_DrivingTests_Clients FOREIGN KEY (client_id) REFERENCES Clients (client_id);

Dies sind die Fehler, die ich bekomme:

mysql> ALTER TABLE Applications ADD CONSTRAINT FK_Applications_Cars FOREIGN KEY
(car_id) REFERENCES Cars (car_id);
ERROR 1005 (HY000): Can't create table 'foo.#sql-12c_4' (errno: 150)

Ich lief SHOW ENGINE INNODB STATUS, was eine detailliertere Fehlerbeschreibung enthält:

------------------------
LATEST FOREIGN KEY ERROR
------------------------
100509 20:59:49 Error in foreign key constraint of table foo/#sql-12c_4:
 FOREIGN KEY (car_id) REFERENCES Cars (car_id):
Cannot find an index in the referenced table where the
referenced columns appear as the first columns, or column types
in the table and the referenced table do not match for constraint.
Note that the internal storage type of ENUM and SET changed in
tables created with >= InnoDB-4.1.12, and such columns in old tables
cannot be referenced by such columns in new tables.
See http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html
for correct foreign key definition.
------------

Ich habe auf StackOverflow herumgesucht und an anderer Stelle online - bin auf einen hilfreichen Blogbeitrag mit Hinweisen zur Behebung dieses Fehlers gestoßen - aber ich kann nicht herausfinden, was schief läuft. Jede Hilfe wäre dankbar!

45
Ankur Banerjee

Sie sollten car_id zu einem Primärschlüssel in Autos machen.

37
Paul Tomblin

Hinweis: Ich hatte das gleiche Problem, und das lag daran, dass das referenzierte Feld in den zwei verschiedenen Tabellen in einer anderen Sortierung lag (sie hatten exakt denselben Typ).

Stellen Sie sicher, dass alle referenzierten Felder denselben Typ UND dieselbe Sortierung haben!

30
NickT

Überprüfen Sie, ob BEIDE Tabellen den gleichen ENGINE haben. Zum Beispiel, wenn Sie haben:

CREATE Table FOO ();

und:

CREATE Table BAR () ENGINE=INNODB;

Wenn Sie versuchen, eine Einschränkung von der Tabellen-BAR bis zur Tabelle FOO zu erstellen, funktioniert dies bei bestimmten MySQL-Versionen nicht.

Beheben Sie das Problem, indem Sie folgendermaßen vorgehen:

CREATE Table FOO () ENGINE=INNODB;
13
Ville Rontti

Subtile, aber dieser Fehler hat mich dazu gebracht, weil ich vergessen habe, eine Smallint-Spalte als nicht signiert zu deklarieren, um mit der referenzierten, vorhandenen Tabelle übereinzustimmen, die "smallint unsigned" war. Da einer von unsigniert und nicht von unsigniert war, konnte MySQL verhindern, dass der Fremdschlüssel in der neuen Tabelle erstellt wurde.

id smallint(3) not null

passt nicht für Fremdschlüssel,

id smallint(3) unsigned not null
11
Eric Lawler

Ich habe diesen völlig wertlosen und nicht informativen Fehler erhalten, als ich versuchte:

ALTER TABLE `comments` ADD CONSTRAINT FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE;

Mein Problem war in meiner Kommentartabelle, Benutzer-ID wurde definiert als:

`user_id` int(10) unsigned NOT NULL

Also ... in meinem Fall war das Problem der Konflikt zwischen NOT NULL und ON DELETE SET NULL.

8
Mars Redwyne

Auch müssen beide Tabellen denselben Zeichensatz haben. 

für z.B. 

CREATE TABLE1 (
  FIELD1 VARCHAR(100) NOT NULL PRIMARY KEY,
  FIELD2 VARCHAR(100) NOT NULL
)ENGINE=INNODB CHARACTER SET utf8 COLLATE utf8_bin;

zu 

CREATE TABLE2 (
  Field3 varchar(64) NOT NULL PRIMARY KEY,
  Field4 varchar(64) NOT NULL,
  CONSTRAINT FORIGEN KEY (Field3) REFERENCES TABLE1(FIELD1)
) ENGINE=InnoDB;

Versagt, weil sie unterschiedliche Zeichensätze haben. Dies ist ein weiterer subtiler Fehler, bei dem mysql denselben Fehler zurückgibt. 

5
user2315570

Ich verwende Ubuntu Linux, und in meinem Fall wurde der Fehler durch eine falsche Anweisungssyntax verursacht (die ich durch das Eintippen von perror 150 am Terminal herausgefunden habe

MySQL-Fehlercode 150: Fremdschlüsseleinschränkung ist falsch gebildet

Ändern der Syntax der Abfrage von

alter table scale add constraint foreign key (year_id) references year.id;

zu

alter table scale add constraint foreign key (year_id) references year(id);

behoben.

3
Jeshurun

Ich habe auch diesen Fehler (für mehrere Tabellen) zusammen mit Einschränkungsfehlern und dem Verbinden und Trennen von MySQL erhalten, wenn versucht wird, eine gesamte Datenbank (~ 800 MB) zu importieren. Mein Problem war das Ergebnis von Der MySQL-Server max erlaubte Pakete, die zu niedrig sind. So lösen Sie dieses Problem (auf einem Mac):

  • /Private/etc/my.conf wurde geöffnet
  • Unter # Der MySQL-Server , max_allowed_packet von 1M in 4M geändert (Sie müssen möglicherweise mit diesem Wert experimentieren.)
  • MySQL neu gestartet

Die Datenbank wurde danach erfolgreich importiert.

Hinweis Ich verwende MySQL 5.5.12 für Mac OS X (x86 64 Bit).

2
h-bomb

Das referenzierte Feld muss ein "Schlüssel" in der referenzierten Tabelle sein, nicht notwendigerweise ein Primärschlüssel. Daher sollte "car_id" entweder ein Primärschlüssel sein oder mit NOT NULL- und UNIQUE-Einschränkungen in der Tabelle "Cars" definiert werden.

Darüber hinaus müssen beide Felder vom gleichen Typ und der gleichen Sortierung sein.

2
AKSinha

prüfen Sie, ob das Feld, auf das Sie sich beziehen, genau mit dem Fremdschlüssel übereinstimmt. In meinem Fall war einer nicht signiert und der andere war signiert. Ich habe sie also entsprechend geändert und dies hat funktioniert

ALTER TABLE customer_information ADD CONSTRAINT fk_customer_information1 FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE ON UPDATE CASCADE

1
Ashahmali

Gelöst:

Stellen Sie sicher, dass Primary_Key und Foreign_Key genau mit den Datentypen übereinstimmen. Wenn ein anderer signiert ist, wird er nicht signiert, ist dies nicht der Fall. Eine gute Vorgehensweise ist, dass beide unsigned int sind.

1

ich habe ein Problem gelöst und wollte es teilen:

Ich hatte diesen Fehler <> Das Problem war in meiner Aussage: 

alter table system_registro_de_modificacion add fremdschlüssel (usuariomodificador_id) REFERENCES Usuario (id) Beim Löschen einschränken;

Ich hatte das CASING falsch geschrieben: Es funktioniert in Windows WAMP, aber in Linux MySQL ist das CASING strenger. Wenn Sie also "Usuario" anstelle von "usuario" (genaues Gehäuse) schreiben, wurde der Fehler generiert und das Problem wurde einfach durch Ändern des Befehls korrigiert Gehäuse.

0
David L

Ich habe einen doppelten Fremdschlüsselnamen verwendet.

Das Umbenennen des FK-Namens hat mein Problem gelöst.

Klärung:

Beide Tabellen hatten eine Einschränkung namens PK1, FK1 usw. Durch Umbenennen/eindeutige Namen wurde das Problem gelöst.

0
daVe

Die Spalte, auf die verwiesen wird, muss ein Index einer einzelnen Spalte oder der ersten Spalte in einem Mehrspaltenindex sein und denselben Typ und dieselbe Sortierung aufweisen.

Meine beiden Tabellen haben unterschiedliche Sortierungen. Es kann angezeigt werden, indem der Status der Showtabelle wie table_name ausgegeben wird, und die Sortierung kann geändert werden, indem die Änderungstabelle table_name in den Zeichensatz utf8 ausgegeben wird.

0
Rin-Kiet Riu