it-swarm.com.de

MariaDB: FEHLER 1452 (23000): Eine untergeordnete Zeile kann nicht hinzugefügt oder aktualisiert werden: Eine Fremdschlüsseleinschränkung schlägt fehl

Diese Frage wurde bereits zuvor gestellt, aber keine der vorgeschlagenen Antworten war auf meine Situation anwendbar.

Problem:

Ich kann aufgrund einer Fremdschlüsselverletzung keine Daten in eine Spalte einfügen. Der Fremdschlüssel ist jedoch eine gültige Referenz.

Fehlgeschlagene Abfrage:

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

Error:

FEHLER 1452 (23000): Eine untergeordnete Zeile kann nicht hinzugefügt oder aktualisiert werden: Eine Fremdschlüsseleinschränkung schlägt fehl (mydb. insert-table, CONSTRAINT FK_foobar AUSLÄNDISCHER SCHLÜSSEL (foobar-id) ) REFERENZEN foobar-table (foobar-id))

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

Schema:

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

Fehlerbehebung:

  1. die Daten sind da (kein Tippfehler, siehe Fehlerabschnitt)
  2. beide Spalten haben die gleiche Typdeklaration (siehe oben)
  3. die verwendete Engine ist bereits InnoDB (einige Websites empfehlen, darauf zu wechseln).
  4. Ich habe versucht, die Spaltennamen aus der Anweisung zu entfernen, falls MySQL aufgrund eines Fehlers dies ignoriert (da beide vom gleichen Typ sind).
  5. SELECT VERSION(); 5.6.10
  6. SHOW VARIABLES LIKE 'innodb_version'; 1.2.10
  7. Ausführen (mit dem Privileg 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!

Verbunden:

3
pyb

Offensichtlich passiert dies nicht bei allen Fremdschlüsseln, daher vermuten wir, dass dieser Fremdschlüssel beschädigt wurde.

Die Lösung bestand darin, den Fremdschlüssel zu löschen und neu zu erstellen.

3
pyb