2009-08-18 15 views
5

Esto es algo relacionado con this question:Eliminar filas no se hace referencia por una llave extranjera

tengo una tabla con una clave principal, y tengo varias tablas que hacen referencia a que la clave principal (usando claves foráneas). Necesito eliminar filas de esa tabla, donde la clave principal no se referencia en ninguna de esas otras tablas (así como algunas otras restricciones).

Por ejemplo:

Group 
groupid | groupname 
    1 | 'group 1' 
    2 | 'group 3' 
    3 | 'group 2' 
    ... | '...' 

Table1 
tableid | groupid | data 
    1 | 3 | ... 
    ... | ... | ... 

Table2 
tableid | groupid | data 
    1 | 2 | ... 
    ... | ... | ... 

y así sucesivamente. Algunas de las filas del grupo no están referenciadas en ninguna de las tablas, y necesito eliminar esas filas. Además de esto, necesito saber cómo encontrar todas las tablas/filas que hacen referencia a una fila determinada en el Grupo.

Sé que puedo consultar todas las tablas y verificar las groupid's, pero como son claves foráneas, imagino que hay una mejor manera de hacerlo.

Esto está usando Postgresql 8.3 por cierto.

Respuesta

3

En el corazón de la misma, servidores SQL que no mantienen información de 2 vías para las restricciones, por lo que su única opción es hacer lo que el servidor podría hacer internamente si se va a eliminar la fila: comprobar todos los demás mesa.

Si (y sin dudas primero) sus restricciones son simples comprobaciones y no llevan ninguna instrucción de tipo "on delete cascade", puede intentar borrar todo de su tabla de grupo. Cualquier fila que elimine no tendría nada que lo haga referencia. De lo contrario, estás atrapado con la respuesta de Quassnoi.

10
DELETE 
FROM group g 
WHERE NOT EXISTS 
     (
     SELECT NULL 
     FROM table1 t1 
     WHERE t1.groupid = g.groupid 
     UNION ALL 
     SELECT NULL 
     FROM table1 t2 
     WHERE t2.groupid = g.groupid 
     UNION ALL 
     … 
     ) 
+3

Bueno, como dije, me gustaría evitar esta situación. Hay varias tablas, las convenciones de nombres no son estándar y son lentas. Como la restricción ya está en su lugar, creo que tiene que haber una mejor manera. –

Cuestiones relacionadas