Question

J'ai lu un certain nombre de messages sur cette erreur, mais aucune des solutions n'a réussi à résoudre le problème (en supposant que je les ai essayés correctement).

C'est le code qui provoque l'erreur:

CREATE TABLE season
(
  id          smallint unsigned NOT NULL auto_increment,
  title       varchar(25) NOT NULL,

  PRIMARY KEY (id)
);

CREATE INDEX seasonId ON season(id);

DROP TABLE IF EXISTS event;
CREATE TABLE event
(
  id           smallint unsigned NOT NULL auto_increment,
  title        varchar(255) NOT NULL,
  season_id    smallint NOT NULL,

  PRIMARY KEY (id),
  FOREIGN KEY (season_id) REFERENCES season(id)
  ON UPDATE RESTRICT ON DELETE RESTRICT
);

Ainsi, selon l'erreur, il y a un problème avec ma déclaration de clé étrangère. Cependant, j'avais déjà exécuté ce code sur la machine sans aucun problème, et il fonctionnait également parfaitement sur ma machine Linux (je travaille actuellement sous Windows 7).

Voici la sortie de SHOW ENGINE INNODB STATUS:

------------------------
LATEST FOREIGN KEY ERROR
------------------------
120229 17:43:28 Error in foreign key constraint of table fcrcontent/event:
FOREIGN KEY (season_id) REFERENCES season(id)
  ON UPDATE RESTRICT ON DELETE RESTRICT
):
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.5/en/innodb-foreign-key-constraints.html
for correct foreign key definition.

J'ai également essayé d'exécuter mon script sur une nouvelle base de données, mais non.

Voici la sortie de show create table season:

| season | CREATE TABLE `season` (
  `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
  `title` varchar(25) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `seasonId` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
Était-ce utile?

La solution

Depuis la saison.id n'est pas signé, Event.Season_id doit également être non signé:

CREATE TABLE event
(
  id           smallint unsigned NOT NULL auto_increment,
  title        varchar(255) NOT NULL,
  season_id    smallint unsigned NOT NULL,

  PRIMARY KEY (id),
  FOREIGN KEY (season_id) REFERENCES season(id)
  ON UPDATE RESTRICT ON DELETE RESTRICT
);

Autres conseils

Pour des problèmes avec "Can't Create Table 'X' (Errno: 150)", consultez cette page.

La chose la plus importante qu'il souligne est de se connecter à votre serveur MySQL à partir de la ligne de commande immédiatement après cela et tapez:

Afficher le statut InNODB du moteur;

Cela crachera toutes sortes de conneries, mais surtout, vous devriez voir une section intitulée "Dernière erreur de clé étrangère", où vous verrez le problème réel, en disant quelque chose comme ceci:


Dernière erreur de clé étrangère

121114 16:22:57 Erreur dans la contrainte de clé étrangère du tableau DGWeb / Company: Il n'y a pas d'index dans le tableau référencé qui contiendrait les colonnes comme les premières colonnes, ou les types de données dans la table référencée ne correspondraient pas à celles du tableau. CONSTRAINTION:, CONSTRAINTION "FK_COMPANY_WF_REPORTING_INFO" Clé étrangère ("WF_REPORTING_INFO") Références> "WF_Reportting_info" ("WF_Reporting_info_id") L'index dans la clé étrangère dans le tableau est "FK_COMPANY_WF_REPORTING_INFO" voir " http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-ctrensraintes.htmlPour une définition de clé étrangère correcte.

Alors vous saurez ce qui va mal :-).

Puisque vous n'avez pas montré la sortie de show create table season, Je ne peux pas être sûr de votre problème.

Cependant, le Docs MySQL avoir une liste de contrôle:

  • Les colonnes correspondantes [...] doivent avoir des types de données internes similaires. [.. La taille et le signe des types entiers doivent être les mêmes

  • INNODB nécessite des indices sur les clés étrangères et les clés référencées [...].

  • ...] Dans le tableau référencé, il doit y avoir un index où les colonnes référencées sont répertoriées comme les premières colonnes dans le même ordre.

(met l'accent sur la mienne).

Veuillez vous assurer que vos tables répondent à ces critères; S'il échoue toujours, lisez le reste des critères sur la page Docs.

Cette :

`id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,

Doit être exactement le même type que ceci:

season_id    smallint NOT NULL,

Alors changez-le en

smallint(5)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top