ORA-02292: integrity constraint (OWNER.CONSTRAINT) violated – child record found
Este error de Oracle salta al borrar una fila que está referenciada en otras tablas, es decir, una fila que tiene hijas. Esto se puede arreglar con un ON DELETE CASCADE, pero no era mi caso. Tenía dos tablas, MCP_BASKET y MCP_BASKET_ITEM.
Al borrar en MCP_BASKET, Oracle me advertía de la restricción MCP_BSKITMSUB_FK, que yo creía que se correspondía con la columna «IDBASKET» de MCP_BASKET_ITEM. Sin embargo, no encontraba el identificador de la tabla MCP_BASKET en esa columna. Afortunadamente, encontré este artículo en el que se explica cómo «depurar este error». Copié la sentencia SQL que allí se proponía:
SELECT ac.owner AS left_owner, ac.constraint_name AS left_name, ac.table_name AS left_table, acc.column_name AS left_column, acc.position AS left_position, acr.owner AS right_owner, acr.constraint_name AS right_name, acr.table_name AS right_table, accr.column_name AS right_column, accr.position AS right_position
FROM all_constraints ac
JOIN all_cons_columns acc ON ac.constraint_name=acc.constraint_name
JOIN all_constraints acr ON ac.r_constraint_name=acr.constraint_name
JOIN all_cons_columns accr ON acr.constraint_name=accr.constraint_name
WHERE ac.owner='MCPDBUSER'
AND ac.constraint_name='MCP_BSKITMSUB_FK';
LEFT_OWNER LEFT_NAME LEFT_TABLE LEFT_COLUMN LEFT_POSITION RIGHT_OWNER RIGHT_NAME RIGHT_TABLE RIGHT_COLUMN RIGHT_POSITION
MCPDBUSER MCP_BSKITMSUB_FK MCP_BASKET_ITEM IDSUBBASKET 1 MCPDBUSER MCP_BASKET_PK MCP_BASKET ID 1
El misterio es que la columna a la que hacía referencia la restricción no era idbasket, sino idsubbasket. La confusión venía porque ambas hacen referencia a la llave primaria de MCP_BASKET.