MySQL "ERREUR 1005 (HY000): ne Peut pas créer la table 'foo.# sql-12c 4' (errno: 150)"

je travaille sur la création des tables dans la base de données foo, mais à chaque fois que je me retrouve avec errno 150 concernant la clé étrangère. Tout d'abord, voici mon code pour créer des tables:

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

ce sont les erreurs que j'obtiens:

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)

j'ai couru SHOW ENGINE INNODB STATUS ce qui donne une description détaillée de l'erreur:

------------------------
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.
------------

j'ai cherché partout sur StackOverflow et d'ailleurs en ligne - je suis tombé sur un billet de blog utile ici avec des conseils sur la façon de résoudre ce problème erreur - mais je n'arrive pas à comprendre ce qui va mal. Toute aide serait appréciée!

45
demandé sur OMG Ponies 2010-05-10 00:14:32

14 réponses

Vous devriez faire car_id une clé primaire dans les voitures.

36
répondu Paul Tomblin 2010-05-09 20:18:16

Note: j'ai eu le même problème, et c'était parce que le champ référencé était dans une compilation différente dans les 2 tables différentes (ils avaient exactement le même type).

assurez-vous que tous vos champs référencés ont le même type et la même collation!

30
répondu NickT 2011-08-22 23:49:01

vérifiez que les deux tables ont le même moteur. Par exemple, si vous avez:

CREATE Table FOO ();

et:

CREATE Table BAR () ENGINE=INNODB;

si vous essayez de créer une contrainte d'une barre de table à une table FOO, cela ne fonctionnera pas sur certaines versions MySQL.

corrigez la question comme suit:

CREATE Table FOO () ENGINE=INNODB;
13
répondu Ville Rontti 2012-10-01 23:56:58

subtile, mais cette erreur m'a pris parce que j'ai oublié de déclarer une colonne smallint comme non signée pour correspondre à la table existante référencée qui était "smallint non signée."Le fait d'avoir une clé non signée et une autre non signée a empêché MySQL de créer la clé étrangère sur la nouvelle table.

id smallint(3) not null

ne correspond pas, pour l'amour de clés étrangères,

id smallint(3) unsigned not null
10
répondu Eric Lawler 2012-01-03 21:58:20

j'ai eu cette erreur complètement inutile et non informative quand j'ai essayé de:

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

mon problème était dans ma table de commentaires, user_id a été défini comme:

`user_id` int(10) unsigned NOT NULL

... dans mon cas, le problème était le conflit entre NOT NULL, et ON DELETE SET NULL.

8
répondu Mars Redwyne 2012-07-02 14:55:29

par exemple

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;

échoueront parce qu'ils ont des charsets différents. C'est un autre échec subtil où mysql renvoie la même erreur.

5
répondu user2315570 2013-04-24 12:46:16

J'utilise Ubuntu linux, et dans mon cas l'erreur a été causée par une syntaxe de déclaration incorrecte (que j'ai découvert en tapant perror 150 au terminal, ce qui donne

MySQL code d'erreur 150: contrainte de clé Étrangère est mal formée

changer la syntaxe de la requête de

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

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

fixe.

3
répondu Jeshurun 2011-09-01 05:17:21

Le champ référencé doit être une "Clé" dans la table référencée, pas nécessairement une clé primaire. Ainsi, le " car_id "devrait être soit une clé primaire, soit défini avec des contraintes non nulles et uniques dans la table" Cars".

et de plus, les deux champs doivent être du même type et collation.

2
répondu AKSinha 2013-01-05 18:25:12

j'ai également reçu cette erreur (pour plusieurs tables) ainsi que des erreurs de contrainte et MySQL se connecter et se déconnecter en essayant d'importer une base de données entière (~800 Mo). Mon problème est le résultat de le serveur MySQL max a permis aux paquets d'être trop bas. Pour résoudre ce (sur un Mac):

  • Ouvert /private/etc/my.conf
  • # Le serveur MySQL, a changé max_allowed_packet de 1M à 4M (vous pourriez avoir besoin d'expérimenter avec ce valeur.)
  • Redémarré MySQL

La base de données a été importée avec succès après cela.

Remarque, je suis sous MySQL 5.5.12 pour Mac OS X (x86 64 bits).

2
répondu h-bomb 2013-10-24 18:24:58

vérifier pour faire le champ auquel vous faites référence est une correspondance exacte avec clé étrangère, dans mon cas l'un n'a pas été signé et l'autre a été signé donc je les ai juste changés pour correspondre et cela a fonctionné

modifier la table customer_information Ajouter une contrainte fk_customer_information1 LA CLÉ ÉTRANGÈRE (user_id) RÉFÉRENCES users (id) SUR SUPPRIMER CASCADE ON UPDATE CASCADE

1
répondu Ashahmali 2015-02-24 07:13:44

Résolu:

vérifiez que Primary_Key et Foreign_Key correspondent exactement aux types de données. Si l'un est signé un autre non signé, il sera échoué. La bonne pratique consiste à s'assurer que les deux documents ne sont pas signés int.

1
répondu Mohammad Selim Miah 2016-07-27 16:45:22

tous, j'ai résolu un problème et je voulais le partager:

j'ai eu cette erreur <> La question était la suivante dans ma déclaration:

modifier la table system_registr_de_modificacion ajouter une clé étrangère (usuariomodificador_id) REFERENCES Usuario (id) On delete restrict;

j'avais mal écrit Le boîtier: il fonctionne sous Windows WAMP, mais sous Linux MySQL il est plus strict avec le boîtier, donc écrire "Usuario" au lieu de" usuario " (boîtier exact), a généré l'erreur, et a été corrigé en changeant simplement le boîtier.

0
répondu David L 2015-01-14 18:51:14

j'utilisais un double nom de clé étrangère.

renommer le nom FK a résolu mon problème.

Précision:

les deux tables avaient une contrainte appelée PK1, FK1, etc. Les renommer / rendre les noms uniques a résolu le problème.

0
répondu daVe 2015-11-25 01:02:47

la colonne référencée doit être un index d'une colonne simple ou la première colonne dans l'index à plusieurs colonnes, et le même type et la même collation.

mes deux tables ont des collations différentes. Il peut être affiché en affichant l'état de la table comme table_name et le classement peut être modifié que par l'émission de l'instruction alter table table_name convertir en jeu de caractères utf8.

0
répondu Rin-Kiet Riu 2016-01-26 06:17:33