Integridad referencial MySQL

codek0rZ

Buenas tengo una duda en un proyecto que estoy realizando y no estoy muy seguro de como resolverlo, el escenario en cuestión es el siguiente:

Marcas <1:N> Modelos
id-----------------id
marca-----------idmarca
--------------------modelo

El problema lo tengo en que cuando elimino una marca la cual es clave ajena de varios modelos se me eliminan estos modelos también. Quería prevenir esto, de manera que cuando se elimine una marca todos los modelos pertenecientes a esta marca cambien su idmarca a uno por defecto (0).
¿Cómo debería hacer esto? ¿Es posible eliminar el ON CASCADA DELETE? La verdad que no me llevo muy bien con las bases de datos, ¿los triggers serían una solución?

Saludos y gracias!

CrIpI

Seria quitar el on delete cascade pero ahora mismo no se como es en realidad. Vamos otro tipo de eliminacion.

codek0rZ

¿Cómo se llaman estos tipos de eliminación? XD Lo digo porque intento buscar en google pero no encuentro nada que me sirva aparentemente...

Fyn4r

Desde el desconocimiento de las BDs, no existe algún "null on delete" o algo así? si existe te podría valer imagino

Tolomeo

Has probado con "ON DELETE SET NULL" (en la clave ajena)?

tirano

Hay 4 tipos: Restricted( no te dejaría borrarlo) cascade (lo de ahora) null (valores nulos) o default (un valor por defecto que tu pongas)

codek0rZ

Ajam probare con eso que habláis ya que justamente estaba leyéndolo ahora de la documentación oficial de mysql. Gracias

Tolomeo

"on delete cascade on update cascade" , con el update creo que mejor

codek0rZ

Ya, estoy leyendo que si uso el motor InnoDB no soporta el SET DEFAULT.. :( http://dev.mysql.com/doc/refman/5.0/es/innodb-foreign-key-constraints.html tendré que pensar el usar SET NULL si no conocéis otra opción

Saludoss y gracias

codek0rZ

¿No se puede modificar una FK para añadir el SET NULL? ¿Que tendría que crear la tabla de nuevo y volcar los datos, no?

2 respuestas
eXtreM3

#10 no te funciona el ON DELETE SET NULL? Cuando borres el padre, los registros de la tabla relación se ponen a NULL, 100% seguro de ello.

charl1

#10 No, lo que has de hacer de nuevo es la restricción.

ALTER TABLE nombre_tabla 
DROP CONSTRAINT nombre_restriccion;
ALTER TABLE nombre_tabla 
  ADD CONSTRAINT nombre_restriccion 
  FOREIGN KEY(clave_foranea) 
  REFERENCES nombre_tabla_referenciada(clave_referenciada)
  ON DELETE SET NULL;
codek0rZ

Ya gracias, el problema era que mi clave ajena era clave primaria tambien y por lo tanto cuando lo ponía como NULL no lo guardaba, así que lo quite de clave primaria, le puse que admita nulos e hice la relación con ON DELETE SET NULL ON UPDATE CASCADE.

Gracias a todos

1 respuesta
kraneok

#13 Y para que quieres guarder modelos de marcas, si no existe una marca no existe ese modelo.

codek0rZ

Pues teniendo en cuenta que el cliente la ha liado (parte de culpa es mia, ofc) ha insertado marcas duplicadas y para que el mismo pueda eliminar los duplicados desde el panel de control y posteriormente pueda cambiar los modelos a la marca correspondiente sin tener que volver a añadir ese modelo.
Saludos

eXtreM3

y por qué no te llevas los modelos a las marcas buenas y después te cargas las duplicadas?

codek0rZ

Pues porque tengo mas de 7000 modelos y para el cliente resulta mas facil borrar las marcas duplicadas y luego arreglar los modelos que no tengan marca, que ir uno a uno comprobando la marca. Asi lo solucione ya :)

Usuarios habituales

  • codek0rZ
  • eXtreM3
  • kraneok
  • Tolomeo
  • tirano
  • Fyn4r
  • CrIpI