Frage

Ich arbeite auf einige Tabellen in der Datenbank foo erstellen, aber jedes Mal, wenn ich mit errno 150 in Bezug auf den Fremdschlüssel am Ende. Zum einen ist hier mein Code-Tabellen für die Erstellung von:

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

Das sind die Fehler, die ich bekommen:

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 die eine detailliertere Fehlerbeschreibung gibt:

------------------------
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 suchte auf Stackoverflow um und anderswo Online -

Andere Tipps

. Hinweis: Ich hatte das gleiche Problem, und es war, weil das referenzierte Feld in einer anderen Zusammenstellung wurde in den zwei verschiedenen Tabellen (sie hatten genau die gleiche Art)

Stellen Sie sicher, dass alle Ihre referenzierten Felder haben die gleiche Art und die gleiche Zusammenstellung!

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

CREATE Table FOO ();

und

CREATE Table BAR () ENGINE=INNODB;

Wenn Sie versuchen, eine Einschränkung von Tisch BAR Tabelle FOO zu erstellen, wird es nicht die Arbeit an bestimmten MySQL-Versionen.

Fix das Problem durch folgende:

CREATE Table FOO () ENGINE=INNODB;

Subtil, aber dieser Fehler hat mich, weil ich eine Smallint Spalte als unsigned zu erklären, vergessen die referenzierte übereinstimmen, die vorhandene Tabelle war „unsigned smallint.“ Mit einem unsigned und man nicht ohne Vorzeichen verursacht MySQL den Fremdschlüssel aus wird erstellt auf der neuen Tabelle zu verhindern.

id smallint(3) not null

nicht übereinstimmt, aus Gründen des Fremdschlüssels,

id smallint(3) unsigned not null

Ich habe diese völlig wertlos und uninformativ Fehler, als ich versuchte zu:

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

Mein Problem in meinen Kommentaren Tisch war, User_id wurde wie folgt definiert:

`user_id` int(10) unsigned NOT NULL

So ... in meinem Fall war das Problem mit dem Konflikt zwischen NOT NULL, und ON DELETE SET NULL.

Auch die beiden Tabellen müssen 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;

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

Wird scheitern, weil sie unterschiedliche charsets haben. Dies ist ein weiterer subtiler Ausfall wo mysql gleichen Fehler zurückgibt.

verwende ich Ubuntu Linux, und in meinem Fall der Fehler durch eine falsche Anweisung Syntax verursacht (was ich durch Eingabe am Terminal perror 150 herausgefunden, die

gibt

MySQL-Fehlercode 150: Fremdschlüsselbedingung ist falsch gebildet

Ändern der Syntax der Abfrage von

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

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

es festgelegt.

Das referenzierte Feld muss ein „Key“ in der referenzierten Tabelle, die nicht unbedingt ein Primärschlüssel sein. So ist die „car_id“ sollte entweder einen Primärschlüssel oder mit NOT NULL und UNIQUE-Einschränkungen in der „Cars“ Tabelle definiert werden.

Und außerdem beiden Felder des gleichen Typs und Sortierungs sein muss.

Ich habe auch diesen Fehler (für mehrere Tabellen) zusammen mit Beschränkungsfehlern und MySQL Verbinden und Trennen bei dem Versuch, eine komplette Datenbank zu importieren (~ 800 MB). Mein Problem war das Ergebnis von Der MySQL-Server max Pakete zu niedrig zu sein. Um dieses Problem zu beheben (auf einem Mac):

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

Die Datenbank erfolgreich danach importiert.

Hinweis: Ich bin mit MySQL 5.5.12 für Mac OS X (x86 64-Bit).

Überprüfen Sie das Feld, um Sie zu verweisen, ist eine genaue Übereinstimmung mit Fremdschlüssel, in meinem Fall eine war ohne Vorzeichen und der andere wurde unterzeichnet, so dass ich sie nur geändert zu entsprechen und das funktionierte

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

Gelöst:

Überprüfen Sie, primary_key und FOREIGN_KEY zu machen sind exakte Übereinstimmung mit den Datentypen. Wenn man eine andere unsigned unterzeichnet ist, wird es nicht bestanden. Gute Praxis ist es sicherzustellen, beide sind unsigned int.

Ich war ein Duplikat Fremdschlüsselname verwendet wird.

Das Umbenennen der FK Name mein Problem gelöst.

Zur Verdeutlichung:

Beide Tabellen hatte eine Einschränkung genannt PK1, FK1 usw. umbenennen sie / machen die Namen eindeutig das Problem gelöst.

Die referenzierte Spalte muss ein Index einer einzelnen Spalte oder die erste Spalte in mehrspaltigen Index sein, und die gleiche Art und die gleiche Sortierung.

Meine beiden Tabellen haben die verschiedenen Sortierungen. Es kann durch die Ausgabe zeigt Tabellenstatus wie table_name und Sortierungs gezeigt werden kann, durch die Ausgabe von altem table table_name Konvertit Zeichensatz UTF-8 geändert werden.

alle, löste ich ein Problem und wollte es teilen:

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

alter table system_registro_de_modificacion add Fremdschlüssel (Usuariomodificador_id) LITERATUR Usuario (id) auf Löschen beschränken;

hatte ich falsch die KARKASSE geschrieben: es funktioniert in Windows WAMP, aber in Linux MySQL ist es streng mit dem Gehäuse, so „Usuario“ statt „usuario“ (genaue Gehäuse) writting, den Fehler generiert, und wurde korrigiert einfach das Gehäuse zu verändern.

scroll top