MySQL « ERROR 1005 (HY000): Impossible de créer la table 'foo # sql-12c_4.' (Errno: 150) »
-
04-10-2019 - |
Question
Je travaille sur la création des tables dans la base de données foo
, mais chaque fois que je me retrouve avec 150 errno en ce qui concerne 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 je reçois:
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
qui donne une description plus 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.
------------
Je cherchai autour de StackOverflow et ailleurs en ligne -
La solution Vous devriez faire car_id une clé primaire dans les voitures.
Autres conseils
Note:. J'ai eu le même problème, et ce fut parce que le champ référencé était dans un classement différent 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 le même classement!
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 de la table BAR à la table FOO, il ne fonctionnera pas sur certaines versions de MySQL.
Résoudre le problème en suivant:
CREATE Table FOO () ENGINE=INNODB;
Subtil, mais cette erreur m'a parce que j'oublié de déclarer une colonne smallint non signé comme pour correspondre à la référence, table existante qui était « smallint non signé. » Avoir un non signé et non signé, on ne fait MySQL pour empêcher la clé étrangère d'être créé sur la nouvelle table.
id smallint(3) not null
ne correspond pas, à cause des clés étrangères,
id smallint(3) unsigned not null
Je suis tout à fait cette erreur sans valeur et uninformative quand j'ai essayé:
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 suit:
`user_id` int(10) unsigned NOT NULL
Alors ... dans mon cas, le problème était avec le conflit entre NOT NULL et ON DELETE SET NULL.
En outre les deux tableaux doivent avoir le même jeu de caractères.
pour 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;
échouera parce qu'ils ont encodages. Ceci est un autre échec subtile où MySQL retourne même erreur.
J'utilise Linux Ubuntu, et dans mon cas, l'erreur a été provoquée par la syntaxe de l'instruction incorrecte (que j'ai trouvé en tapant perror 150 au terminal, ce qui donne
MySQL code d'erreur 150: contrainte de clé étrangère est mal formé
Modification de 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 il.
Le champ référencé doit être dans le tableau fait référence à une « clé », pas nécessairement une clé primaire. Donc, l'une ou l'autre devrait « car_id » être une clé primaire ou être défini avec des contraintes NOT NULL et UNIQUE dans la table « Cars ».
Et d'ailleurs, les deux champs doivent être du même type et la collation.
J'ai aussi reçu cette erreur (pour plusieurs tables) ainsi que des erreurs de contrainte et MySQL connexion et la déconnexion lors d'une tentative d'importer une base de données complète (~ 800 Mo). Ma question est le résultat de Le serveur MySQL paquets maximum autorisée étant trop faible. Pour résoudre ce (sur un Mac):
- Ouvert /private/etc/my.conf
- Dans # Le serveur MySQL , a changé
max_allowed_packet
de 1 M à 4 M (Vous devrez peut-être expérimenter cette valeur.) - Restarted MySQL
La base de données importées avec succès après.
Notez que je suis en cours d'exécution MySQL 5.5.12 pour Mac OS X (x86 64 bits).
vérifiez le champ que vous faites référence à une correspondance exacte avec clé étrangère, dans mon cas, l'un a été signé et l'autre a été signé donc je les changé pour correspondre et cela a fonctionné
ALTER TABLE customer_information
ADD CONTRAINTE fk_customer_information1
KEY étrangères (user_id
)
RÉFÉRENCES users
(id
)
ON SUPPRIMER CASCADE
ON UPDATE CASCADE
Résolu:
Vérifiez que PRIMARY_KEY et FOREIGN_KEY sont correspondance exacte avec les types de données. Si l'on est signé un autre non signé, il sera échoué. Une bonne pratique consiste à assurer que les deux ne sont pas signées int.
Je travaillais avec un nom en double clé étrangère.
modifier le nom FK a résolu mon problème.
Précision:
Les deux tableaux ont une contrainte appelée PK1, FK1, etc. Les renommer / faire les noms uniques ont résolu le problème.
La colonne référencée doit être un index d'une seule colonne ou la première colonne de l'index de plusieurs colonnes, et le même type et le même classement.
Mes deux tables ont les différents classements. On peut montrer par l'émission d'état de table de spectacle comme table_name
et le classement peut être modifié par l'émission table_name
alter table converti au jeu de caractères UTF8.
, je résolu un problème et je voulais partager:
J'ai eu cette erreur <> La question était dans ma déclaration:
alter table add system_registro_de_modificacion clé étrangère (Usuariomodificador_id) RÉFÉRENCES Usuario (id) sur Supprimer restreindre;
J'avais écrit incorrectement le ENVELOPPE: il fonctionne sous Windows WAMP, mais sous Linux MySQL est plus stricte avec le ENVELOPPE, si writting « Usuario » au lieu de « usuario » (de boîtier exact), a généré l'erreur, et a été corrigé changeant simplement le boîtier.