web-dev-qa-db-fra.com

ERREUR 1452: impossible d'ajouter ou de mettre à jour une ligne enfant: une contrainte de clé étrangère échoue

J'ai créé deux tables dans MySQL 5.6.11 comme indiqué ci-dessous au moyen de MySQL Workbench 5.2.47.

La table country:

delimiter $$

CREATE TABLE `country` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `country_name` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INC

REMENT=2 DEFAULT CHARSET=utf8$$

Le state_table:

delimiter $$

CREATE TABLE `state_table` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `state_name` varchar(45) DEFAULT NULL,
  `country_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  CONSTRAINT `country_fk` FOREIGN KEY (`id`) REFERENCES `country` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT=''$$

Il y a une ligne dans la table country avec la id 1. Elle permet d'insérer une seule ligne (enfant) dans sa table enfant state_table. Si plusieurs lignes sont tentées, l'erreur suivante se produit.

ERREUR 1452: Impossible d'ajouter ou de mettre à jour une ligne enfant: une contrainte de clé étrangère échoue (social_networking.state_table, CONTRAINTE country_fk CLÉ ÉTRANGÈRE (id) RÉFÉRENCES country (id) ON DELETE CASCADE ON UPDATE CASCADE)

Instruction SQL:

INSERT INTO `social_networking`.`state_table` (`id`, `state_name`, `country_id`) VALUES ('2', 'xxx', '1')

En fait, j'essaie de mapper ces tables à l'aide d'un ORM (JPA) où je ne vois toujours que la relation OneToOne.

Qu'est-ce que je rate?

6
Tiny

Je pense que vous avez une faute de frappe dans votre contrainte de clé étrangère, country_id devrait probablement être la clé étrangère de country. Lorsque id est la clé étrangère, vous ne pouvez insérer qu'une seule ligne, car il se trouve que id = 1 est le même identifiant que la ligne dans country;

CONSTRAINT `country_fk` FOREIGN KEY (`id`) 
    REFERENCES `country` (`id`) ON DELETE CASCADE ON UPDATE CASCADE

devrait probablement être

CONSTRAINT `country_fk` FOREIGN KEY (`country_id`) 
    REFERENCES `country` (`id`) ON DELETE CASCADE ON UPDATE CASCADE

n SQLfiddle pour tester .

9

Bon, je trouve la réponse, la solution, mon anglais n'est pas très bien mais je pense pouvoir vous expliquer. J'obtiens cette erreur après avoir essayé de créer un déclencheur, ma base de données a été créée dans phpmyadmin, et cette erreur m'a rendu fou, le problème était qu'avant de créer le déclencheur, je charge beaucoup de données dans mes tables et dans mon enfant la table contenait des données qui n'ont aucune correspondance dans ma table parent, ej: ma table enfant "chat" a un "id_jugador = 1" et dans ma table parent il n'y avait pas que "id_jugador", c'était mon erreur, j'espère que l'aide vous, Argentine Rulz;)

11
Roman Nuñez

J'ai eu le même problème et ce n'était pas un mauvais nom de relation.
J'ai eu un problème avec différents enregistrements, c'est-à-dire que j'ai essayé d'enregistrer un enregistrement qui n'existait pas dans une autre table, donc j'ai généré cette erreur.
Vérifiez si l'enregistrement existe dans une autre table pour insérer leur relation correcte, sinon, cette erreur apparaît.

J'espère que cela vous aidera.

5
example:
 table1(
    id1 INT PRIMARY KEY,
    name1 VARCHAR(50)
 )
 table2(
    id2,<--- want to add FOREIGN KEY to this field
    name2 VARCHAR(50)
 )

Avant d'ajouter une clé étrangère de contrainte, vous devez avoir la bonne valeur entre id1 et id2, vous devez donc mettre à jour ce champ id avec la valeur qui se mappe.

1
Tang Chanrith