#mysql
Вопрос:
Я разрабатываю приложение и использую MySQL в качестве бэкенда. В целом все складывается отлично. Однако у меня есть ошибка ограничения внешнего ключа, которая продолжает появляться при одних и тех же вставках, и я не могу разобраться в проблеме. Вероятно, это очевидно, но.. Я подозреваю, что слишком долго пялился, тыкал и тыкал, так что хотел бы еще одну пару глаз.
Во-первых, вот ошибка, которую выдает MySQL:
Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`rtm`.`rtm_psa_subissue`, CONSTRAINT `rtm_psa_subissue_ibfk_2` FOREIGN KEY (`psa_parent_id`) REFERENCES `rtm_psa_issue` (`id`) ON DELETE RESTRICT)
The SQL being executed was: INSERT INTO `rtm_psa_subissue` (`tenant_id`, `psa_id`, `name`, `is_active`, `psa_parent_id`, `oplock`, `created_at`, `updated_at`, `created_by`, `updated_by`, `uuid`) VALUES (5, 592, 'Complaint/Operations', FALSE, 50, FALSE, NOW(), NOW(), NULL, NULL, '15c8c746f2cd11eb9f221204fb92bd6d')
Обратите внимание, что мой код может вставлять основную часть записей в rtm_psa_subissue, но затем каждый раз начинает создавать исключения в одном и том же месте.
Теперь давайте покажем данные в rtm_psa_issue, где 48 >= rtm_psa_issue.psa_id >:
mysql> select id,name,psa_id from rtm_psa_issue where psa_id > 48 and psa_id < 52;
---- ----------------------- --------
| id | name | psa_id |
---- ----------------------- --------
| 27 | 13 Office Management | 49 |
| 28 | 10 Account Management | 50 |
| 29 | 21 TMS | 51 |
---- ----------------------- --------
3 rows in set (0.00 sec)
Хорошо, отлично, на самом деле в внешней таблице есть строка для rtm_psa_issue.psa_id = 50.
Давайте посмотрим, существует ли строка rtm_psa_subissue.psa_id = 592:
mysql> select id,name,psa_id,psa_parent_id from rtm_psa_subissue where psa_id > 590 and psa_id < 594;
----- ------------ -------- ---------------
| id | name | psa_id | psa_parent_id |
----- ------------ -------- ---------------
| 212 | 10 IT Lead | 591 | 17 |
----- ------------ -------- ---------------
1 row in set (0.00 sec)
Нет, еще не существует.
Так что же происходит?
Я не знаю, как показывать внешние ключи напрямую через клиент mysql, но вот PHP-код для их создания:
rtm_psa_издание
$this->addForeignKey(
'rtm_psa_issue_ibfk_1',
'{{%psa_issue}}',
['tenant_id'],
'{{%user}}',
['id'],
'RESTRICT', // this is for ON DELETE
'NO ACTION' // this is for ON UPDATE
);
rtm_psa_subissue
$this->addForeignKey(
'rtm_psa_subissue_ibfk_1',
'{{%psa_subissue}}',
['tenant_id'],
'{{%user}}',
['id'],
'RESTRICT', // this is for ON DELETE
'NO ACTION' // this is for ON UPDATE
);
$this->addForeignKey(
'rtm_psa_subissue_ibfk_2',
'{{%psa_subissue}}',
['psa_parent_id'],
'{{%psa_issue}}',
['id'],
'RESTRICT', // this is for ON DELETE
'NO ACTION' // this is for ON UPDATE
);
Комментарии:
1.
psa_parrent_id
ссылается наid
столбец, а не наpsa_id
столбец: «ВНЕШНИЙ КЛЮЧ (psa_parent_id
) ССЫЛКИrtm_psa_issue
(id
)»
Ответ №1:
psa_parrent_id
ссылается на id
столбец, а не на psa_id
столбец
FOREIGN KEY (`psa_parent_id`) REFERENCES `rtm_psa_issue` (`id`)
Комментарии:
1. О, ничего СЕБЕ. 🙁 Вот это глупая ошибка. Отличный улов, спасибо!