Не могу понять, что ограничение внешнего ключа не работает

#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. О, ничего СЕБЕ. 🙁 Вот это глупая ошибка. Отличный улов, спасибо!