web-dev-qa-db-ja.com

MariaDB:エラー1452(23000):子行を追加または更新できない:外部キー制約が失敗する

この質問はすでに前に尋ねられましたが、提案された回答のどれも私の状況に当てはまりませんでした。

問題:

外部キー違反のため、列にデータを挿入できません。ただし、外部キーは有効な参照です。

失敗したクエリ:

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

エラー:

エラー1452(23000):子行を追加または更新できません:外部キー制約が失敗します(mydb._insert-table_、CONSTRAINT _FK_foobar_ FOREIGN KEY(_foobar-id_)REFERENCES _foobar-table_(_foobar-id_))

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

スキーマ:

_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
_

トラブルシューティング:

  1. データがあります(タイプミスはありません。エラーセクションを参照してください)
  2. 両方の列が同じ型宣言を持っている(上記を参照)
  3. 使用されているエンジンはすでにInnoDBです(一部のWebサイトはそれに切り替えることを推奨しています)
  4. バグによりMySQLで無視される場合に備えて、ステートメントから列名を削除しようとしました(両方とも同じタイプであるため)
  5. SELECT VERSION(); 5.6.10
  6. _SHOW VARIABLES LIKE 'innodb_version';_ 1.2.10
  7. 実行(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!
_

関連:

3
pyb

明らかに、これはすべての外部キーで発生するわけではないため、その外部キーに影響を与えている破損があったと考えられます。

解決策は、外部キーを削除して再作成することでした。

3
pyb