ORACLE - дочерняя запись не найдена - PullRequest
0 голосов
/ 07 июня 2018

Я пытаюсь удалить одну запись из БД, но ORACLE утверждает, что «нарушено ограничение целостности - найдена дочерняя запись».

Если я пытаюсь найти эту дочернюю запись, она отсутствует в БД.

Кто-нибудь знает, как решить эту проблему?

SQL> delete from AMZ_SERVCO where ID_SERVCO = 447;

delete from AMZ_SERVCO where ID_SERVCO = 447
*
ERROR at line 1:
ORA-02292: integrity constraint (AMAZONIA.FK_AMZ_FRNQIA_PA_AMZ_SERVCO) violated - child record found

SQL> select table_name from all_tab_columns where column_name='ID_SERVCO';

TABLE_NAME
------------------------------
AMZ_DESCTO_PO_SERVCO_APLCAO
AMZ_DESCTO_PO_SERVCO
BKP151207_AMZ_ARQVO_DESCTO
BKP_ARQVO_DESCTO
AMZ_SERVCO_PO
AMZ_SERVCO_PA
AMZ_SERVCO
AMZ_FRNQIA_PO_SERVCO
AMZ_DESCTO_PO
AMZ_CATEGR_PO
AMZ_CATEGR_PA

TABLE_NAME
------------------------------
AMZ_BONUS_PO
AMZ_ASSTUR_PO
AMZ_ASSTUR_PA
AMZ_ARQVO_SERVCO
AMZ_ARQVO_DESCTO
AMZ_APA_PO
AMZ_APA_PA
AMZ_FRNQIA_PA_SERVCO
AMZ_EXPSAO_ENTDDE_OPRDRA

20 rows selected.

SQL> select * from AMZ_EXPSAO_ENTDDE_OPRDRA WHERE ID_SERVCO = 447;
select * from AMZ_FRNQIA_PA_SERVCO WHERE ID_SERVCO = 447;
select * from AMZ_APA_PA WHERE ID_SERVCO = 447;
select * from AMZ_APA_PO WHERE ID_SERVCO = 447;
select * from AMZ_ARQVO_DESCTO WHERE ID_SERVCO = 447;
select * from AMZ_ARQVO_SERVCO WHERE ID_SERVCO = 447;
select * from AMZ_ASSTUR_PA WHERE ID_SERVCO = 447;
select * from AMZ_ASSTUR_PO WHERE ID_SERVCO = 447;
select * from AMZ_BONUS_PO WHERE ID_SERVCO = 447;
select * from AMZ_CATEGR_PA WHERE ID_SERVCO = 447;
select * from AMZ_CATEGR_PO WHERE ID_SERVCO = 447;
select * from AMZ_DESCTO_PO WHERE ID_SERVCO = 447;
select * from AMZ_FRNQIA_PO_SERVCO WHERE ID_SERVCO = 447;
select * from AMZ_SERVCO WHERE ID_SERVCO = 447;
select * from AMZ_SERVCO_PA WHERE ID_SERVCO = 447;
select * from AMZ_SERVCO_PO WHERE ID_SERVCO = 447;
select * from BKP_ARQVO_DESCTO WHERE ID_SERVCO = 447;
select * from BKP151207_AMZ_ARQVO_DESCTO WHERE ID_SERVCO = 447;
select * from AMZ_DESCTO_PO_SERVCO WHERE ID_SERVCO = 447;
select * from AMZ_DESCTO_PO_SERVCO_APLCAO WHERE ID_SERVCO = 447;

no rows selected

SQL>
no rows selected

SQL>
no rows selected

SQL>
no rows selected

SQL>
no rows selected

SQL>
no rows selected

SQL>
no rows selected

SQL>
no rows selected

SQL>
no rows selected

SQL>
no rows selected

SQL>
no rows selected

SQL>
no rows selected

SQL>
no rows selected

SQL>
ID_SERVCO NM_SERVCO ID_TP_SERVCO ID_TP_CATEGR
----------------------------------------------------------------- ------------ ------------
   447 eClaro DDD Nacional                                                                                             5            0

SQL>
no rows selected

SQL>
no rows selected

SQL>
no rows selected

SQL>
no rows selected

SQL>
no rows selected

SQL>
no rows selected

SQL>

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Да, вам нужно найти нарушенное ограничение в списке всех ограничений:

SELECT r_owner, r_constraint_name
  FROM all_constraints 
 WHERE owner='AMAZONIA'
   AND constraint_name='FK_AMZ_FRNQIA_PA_AMZ_SERVCO';

Это имя первичного или уникального ключа родительской таблицы.Чтобы посмотреть его столбцы, вы можете использовать:

SELECT column_name
  FROM all_cons_columns
 WHERE owner = xxx
   AND constraint_name = yyy;
0 голосов
/ 07 июня 2018

Похоже, у вас может быть другой внешний ключ, о котором вы не знаете: попробуйте это решение , чтобы получить список всех внешних ключей.Для сложных систем, подобных этой, я пытаюсь включить логический столбец [IsActive] - вместо удаления записи, у которой могут быть дочерние элементы, вы просто помечаете ее как неактивную.НТН!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...