PostgreSql: obtenga todas las filas que hacen referencia (a través de claves externas) a una fila en particular en una tabla
Esto parece tan simple, pero no he podido encontrar una respuesta a esta pregunta.
¿Qué quiero? Una tabla maestra con filas que se eliminan cuando no se hace referencia a ellas (a través de claves externas). La solución puede o no ser específica para PostgreSql.
¿Cómo? Uno de mis enfoques para resolver este problema (en realidad, el único enfoque hasta ahora) incluye lo siguiente: Para cada tabla que hace referencia a esta tabla maestra, enUPDATE
oDELETE
de una fila, para verificar la fila a la que se hace referencia en el maestro, cuántas otras filas aún se refieren a la fila a la que se hace referencia. Si se reduce a cero, también elimino esa fila en el master.
(Si tienes una idea mejor, me gustaría saber!)
En detalle: Tengo una mesa maestra referenciada por muchos otros
CREATE TABLE master (
id serial primary key,
name text unique not null
);
Todas las otras tablas tienen el mismo formato en general:
CREATE TABLE other (
...
master_id integer references master (id)
...
);
Si uno de estos no esNULL
, se refieren a una fila enmaster
. Si voy a esto y trato de eliminarlo, recibiré un mensaje de error, porque ya se menciona:
ERROR: update or delete on table "master" violates foreign key constraint "other_master_id_fkey" on table "other"
DETAIL: Key (id)=(1) is still referenced from table "other".
Time: 42.972 ms
Tenga en cuenta que no me lleva mucho tiempo resolver esto, incluso si tengo muchas tablas que hacen referenciamaster
. ¿Cómo puedo encontrar esta información sin tener que generar un error?