Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » PostgreSQL »

Constraint para borrar varios campos ON DELETE

Estas en el tema de Constraint para borrar varios campos ON DELETE en el foro de PostgreSQL en Foros del Web. Hola a todos. La duda es si puedo crear una constraint para que la cláusula ON DELETE SET NULL afecte a varios campos de una ...
  #1 (permalink)  
Antiguo 26/03/2007, 06:09
Avatar de Pip
Pip
 
Fecha de Ingreso: noviembre-2003
Ubicación: Málaga
Mensajes: 280
Antigüedad: 21 años, 1 mes
Puntos: 0
Constraint para borrar varios campos ON DELETE

Hola a todos.

La duda es si puedo crear una constraint para que la cláusula ON DELETE SET NULL afecte a varios campos de una sola vez, ya que me sucede lo siguiente. En una tabla tengo tres referencias foráneas a un mismo campo y en esos tres campos tengo puesto ON DELETE SET NULL. Al intentar borrar los datos a los que hacen referencia, el error comienza en el segundo campo, ya que si los tres campos los pongo como ON DELETE SET NULL, ON DELETE CASCADE y ON DELETE CASCADE, no sucede el error.

Mi idea de lo que sucede es que al borrar la fila a la que hacen referencia los tres campos, sólo se "activa" en ese mismo momento el primer ON DELETE SET NULL y en los otros provoca error porque la clave foránea que contienen ya no existe. Sin embargo, si hago una constraint para los tres campos, y cada campo no hiciera referencia a la misma fila, me borraría campos que no debería.

Espero haber conseguido explicar el problema. Por si acaso, pongo un ejemplo simplificado de como lo tengo hecho:

Código PHP:
CREATE TABLE usuario (
  
COD_USUARIO INTEGER PRIMARY KEY
);

CREATE TABLE sub_usuario (
 
COD_SUB_USUARIO INTEGER PRIMARY KEY,
 
DEPENDE1 REFERENCES usuario ON DELETE SET NULL,
 
DEPENDE2 REFERENCES usuario ON DELETE SET NULL,
 
DEPENDE3 REFERENCES usuario ON DELETE SET NULL
); 
Como veréis si lo probáis y no me estoy confundiendo, si los tres SUB_USUARIOS apuntan al mismo usuario, sucede que sólo afecta al primer SET NULL y los demás dan error porque parecen no ejecutarse.

Nota: si pusiera ON DELETE CASCADE no daría error, pero no quiero borrar a los sub_usuarios que no hagan referencia a ese usuario que haya sido borrado.
__________________
por Pip
  #2 (permalink)  
Antiguo 26/03/2007, 07:55
 
Fecha de Ingreso: agosto-2005
Ubicación: Mérida, Venezuela
Mensajes: 732
Antigüedad: 19 años, 3 meses
Puntos: 7
Re: Constraint para borrar varios campos ON DELETE

Hola...

Creo que el problema tiene que ver con cómo has hecho las referencias a las otras tablas....

Al poner CASCADE, le dices que lo haga de esa forma para donde hay relaciones (claves formáneas)...

... o no entendí
__________________
Gracias de todas todas
-----
Linux!
  #3 (permalink)  
Antiguo 26/03/2007, 08:06
Avatar de Pip
Pip
 
Fecha de Ingreso: noviembre-2003
Ubicación: Málaga
Mensajes: 280
Antigüedad: 21 años, 1 mes
Puntos: 0
Re: Constraint para borrar varios campos ON DELETE

Hola cacr.

¿A qué tablas te refieres? Creo que no hay otras tablas que interfieran en el problema que tengo. Mi esquema en cuanto a relaciones es tal y como lo he puesto en el mensaje principal, salvo que también hay dos tablas que hacen referencia a SUB_USUARIO, pero no hay problema porque si se borra un sub_usuario, las filas que hacen referencia a SUB_USUARIO se eliminan mediante CASCADE.

No sé si es a eso a lo que te referías en tu respuesta cacr. Por otro lado, no sé si el problema que tengo lo he explicado con claridad. Intentaré reformularlo.

Tengo esa relación que ves en el mensaje principal. Pues bien, lo que yo quiero es que cuando uno de los tres sub_usuarios de la tabla sub_usuario (llamados depende1, depende2 o depende3) haga referencia a un usuario que sea borrado (y los tres pueden hacer referencia a distintos usuarios o al mismo), el campo correspondiente de la tabla sub_usuario se ponga a nulo.

Y usando ON DELETE SET NULL en los tres DEPENDE tengo el problema de que me da error al hacer un DELETE FROM usuario.
__________________
por Pip
  #4 (permalink)  
Antiguo 26/03/2007, 09:15
 
Fecha de Ingreso: agosto-2005
Ubicación: Mérida, Venezuela
Mensajes: 732
Antigüedad: 19 años, 3 meses
Puntos: 7
Re: Constraint para borrar varios campos ON DELETE

le podrías poner NULL por default...
__________________
Gracias de todas todas
-----
Linux!
  #5 (permalink)  
Antiguo 26/03/2007, 09:49
Avatar de Pip
Pip
 
Fecha de Ingreso: noviembre-2003
Ubicación: Málaga
Mensajes: 280
Antigüedad: 21 años, 1 mes
Puntos: 0
Re: Constraint para borrar varios campos ON DELETE

Creo que eso no soluciona el problema (aunque se lo he puesto porque es necesario que valgan NULL si inicialmente no hacen referencia a ningún usuario).

Verás, cuando hago:

Código PHP:
DELETE FROM usuario
me da el siguiente error:

Código PHP:
ERRORinsert or update on table usuario" violates foreign key constraint "usuario_cod_usuario_fkey"
Estado SQL:23503
Detalle:Key (cod_usuario)=(1) is not present in table "
sub_usuario".
Contexto:SQL statement "
UPDATE ONLY "public"."usuario" SET "depende2" NULL WHERE "depende2" = $1
Y mi lectura de ese error es que postgreSQL comprueba al hacer DELETE FROM usuario qué elemento hace referencia a cod_usuario y hace con él lo que diga su sentencia ON DELETE (poner a nulo o borrarlo en cascada). Y ya no sigue comprobando más referencias a ese campo (al menos que vengan de una misma tabla). Entonces postgresql comprueba que depende2 y depende3 hacen referencia a algo que no existe y da ese error.

Esa es mi lectura del problema, quizás me equivoque, porque me parecería un fallo de postgreSQL, ya que no permitiría una relación como la que yo intento. Ahora mismo tengo incluido el DEFAULT NULL que me has dicho cacr. A pesar de eso, da ese error que es el mismo de antes.

A ver si alguien sabe cual puede ser la posible solución.
__________________
por Pip
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:31.