web-dev-qa-db-fra.com

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

Cette question a déjà été posée auparavant, mais aucune des réponses suggérées n'était applicable à ma situation.

Problème:

Je ne peux pas insérer de données dans une colonne en raison d'une violation de clé étrangère. Cependant, la clé étrangère est une référence valide.

Échec de la requête:

INSERT INTO `insert-table`(`not-important`, `foobar-id`) VALUES ('whatever', 'This exists in both tables');

Erreur:

ERREUR 1452 (23000): Impossible d'ajouter ou de mettre à jour une ligne enfant: une contrainte de clé étrangère échoue (mydb. insert-table, CONTRAINTE FK_foobar CLÉ ÉTRANGÈRE (foobar-id ) RÉFÉRENCES foobar-table (foobar-id))

SELECT COUNT(1) FROM `foobar-table` WHERE `foobar-id` = 'This exists in both tables';
1

Schéma:

mysql> SHOW CREATE TABLE `insert-table`;
CREATE TABLE `insert-table` (
  `foobar-id` varchar(190) COLLATE utf8mb4_unicode_ci NOT NULL,
  `not-important` varchar(190) COLLATE utf8mb4_unicode_ci NOT NULL,
  PRIMARY KEY (`foobar-id`,`not-important`),
  CONSTRAINT `FK_foobar` FOREIGN KEY (`foobar-id`) REFERENCES `foobar-table` (`foobar-id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

mysql> SHOW CREATE TABLE `foobar-table`;
CREATE TABLE `foobar-table` (
  `foobar-id` varchar(190) COLLATE utf8mb4_unicode_ci NOT NULL,
  PRIMARY KEY (`foobar-id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

Dépannage:

  1. les données sont là (pas de faute de frappe, voir la section erreur)
  2. les deux colonnes ont la même déclaration de type (voir ci-dessus)
  3. le moteur utilisé est déjà InnoDB (certains sites recommandent de passer à celui-ci)
  4. J'ai essayé de supprimer les noms de colonne de l'instruction au cas où un bogue ferait en sorte que MySQL l'ignore (car ils sont tous les deux du même type)
  5. SELECT VERSION(); 5.6.10
  6. SHOW VARIABLES LIKE 'innodb_version'; 1.2.10
  7. Exécutez (avec le privilège PROCESS):
SHOW ENGINE INNODB STATUS;

------------------------
LATEST FOREIGN KEY ERROR
------------------------
2018-01-10 15:24:39 2b1f59283700 Transaction:
TRANSACTION 17469656069, ACTIVE 0 sec inserting
mysql tables in use 1, locked 1
1 lock struct(s), heap size 376, 0 row lock(s)
MySQL thread id 147376, OS thread handle 0x2b1f59283700, query id 152047035 123.45.67.89 theDbUser update
INSERT INTO `insert-table` VALUES (‘This exists in the other table’, ‘whatever’)
Foreign key constraint fails for table `mydb`.`insert-table`:
,
 CONSTRAINT `FK_foobar` FOREIGN KEY (`foobar-id`) REFERENCES `foobar-table` (`foobar-id`)
Trying to add to index `PRIMARY` Tuple:
DATA Tuple: 4 fields;
0: len=22; bufptr=0x2b2ea459a812; hex= 546869732065786973747320696e20626f7468207461626c6573; asc This exists in both tables;;
1: len=25; bufptr=0x2b2ea459ab0c; hex= 7768617465766572; asc whatever;;
2: len=6; bufptr=0x2b3a97464610; hex= 00041145cc05; asc    E  ;;
3: len=7; bufptr=0x2b3a97464618; hex= 00000000000000; asc        ;;

But the parent table `mydb`.`foobar-table`
or its .ibd file does not currently exist!

En relation:

3
pyb

Évidemment, cela ne se produit pas sur toutes les clés étrangères, nous soupçonnons donc qu'une corruption affecte cette clé étrangère.

La solution consistait à supprimer et recréer la clé étrangère.

3
pyb