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

duda alter foreign key

Estas en el tema de duda alter foreign key en el foro de Mysql en Foros del Web. Hola a todos. Quisiera saber si es posible modificar un foreign key existente mediante alguna intruccion de alter. Mi problema es que al crear la ...
  #1 (permalink)  
Antiguo 03/01/2012, 15:28
 
Fecha de Ingreso: octubre-2008
Mensajes: 118
Antigüedad: 15 años, 6 meses
Puntos: 2
duda alter foreign key

Hola a todos.

Quisiera saber si es posible modificar un foreign key existente mediante alguna intruccion de alter.
Mi problema es que al crear la tabla cree un foreign key y le asigne unas propiedades de no actualizar, no eliminar y ahora quisiera cambiar esas propiedades (la tabla tiene datos no la puedo reacer)

Esto es posible?

Muchas gracias.

Saludos,
Dani.
  #2 (permalink)  
Antiguo 03/01/2012, 17:08
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: duda alter foreign key

Técnicamente es posible, pero ¿estás seguro que lo que quieres hacer es lo que necesitas?

Una FK tiene por objetivo mantener la integridad referencial y la consistencia de los datos. Tu no puedes hacer que un registro que se usa como FK se borre o modifique porque en otras tablas la PK de esa tabla se usa como referncia de validez. SI eliminas eso, o lo modificas, perderás consistencia de datos entre tablas y empezarás a tener datos basura.
Lo que es posible es que no estés modificando o borrando en el orden correcto, si es así es eso lo que debes corregir, y no crear un "parche" que luego te traerá probllemas.

¿Por qué no nos explicas bien cómo y en qué casos tienes este problema?
Tal vez te podamos guiar mejor.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 04/01/2012, 07:02
 
Fecha de Ingreso: octubre-2008
Mensajes: 118
Antigüedad: 15 años, 6 meses
Puntos: 2
Respuesta: duda alter foreign key

El problema que tengo es que al intentar borrar un registro me da el siguiente error:

Cannot delete or update a parent row: a foreign key constraint fails (`dpl_gestaller/facturas`, CONSTRAINT `facturas_ibfk_1` FOREIGN KEY (`id_presupuesto`) REFERENCES `presupuestos` (`id_presupuesto`) ON DELETE NO ACTION ON UPDATE NO ACTION)

Este error no deberia de darmelo xk previamente yo ya compruebo si existe una relacion entre presupuesto y factura desde mi programa.
Ademas como me estuve pegando con el mysql para conseguir un mysql server portable y con la base de datos instalada no me fio mucho de q los foreign key y demas esten en su sitio.
Es por eso que quiero o modificar este foreign key o eliminarlo ya que la comprobacion la hago yo desde el programa y no es necesaio el foreign key.

Saludos.
  #4 (permalink)  
Antiguo 04/01/2012, 07:38
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: duda alter foreign key

Buen, pero según ese mensaje, tienes al menos un presupuesto vinculado a esa factura. Si no lo borras, no podrás borrar la factura.
Otra opción es que ese campo sea NULL en la tabla factura.
¿Probaste esa opción?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 04/01/2012, 08:03
 
Fecha de Ingreso: octubre-2008
Mensajes: 118
Antigüedad: 15 años, 6 meses
Puntos: 2
Respuesta: duda alter foreign key

El problema posiblemente este en q se corrompieron las relaciones o no estan bien echas.

Por ejemplo presupuestos tiene un campo id y año, facturas tiene un cambo id_presupuesto y año_presupuesto. Estos campos estan relacionados, en un principio, para que los 2 sean iguales ya q id y año de presupuesto son primary key pero se ve que esta comparando el id de presupuestos con id_presupuesto de facturas sin tener en cuenta el año, por eso me dice que existe una relacion.

Como ya he dicho, antes de hacer esta operacion compruebo (mediante el programa) que no existe una factura relacionada con el presupuesto y esto funciona bien. (Compruebo el id d presupuestos con id_presupuesto y año con año_presupuesto y no retorna ninguna factura) llegado a este punto lo q voy a hacer es eliminar el fk de facturas y dejarle al programa que haga esta comprobacion.


P.D. los campos no son NULL ya que no permito NULL en esos campos
  #6 (permalink)  
Antiguo 04/01/2012, 08:58
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: duda alter foreign key

Me gustaría ver cómo tienes definidas esas tablas, para tener más claro por qué se produce el problema...
¿Podrías postear el CREATE Table de las tablas involucradas?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 04/01/2012, 14:43
 
Fecha de Ingreso: octubre-2008
Mensajes: 118
Antigüedad: 15 años, 6 meses
Puntos: 2
Respuesta: duda alter foreign key

estas son las tablas en cuestion:

CREATE TABLE `facturas` (
`id_factura` int(10) unsigned NOT NULL,
`anio` int(4) NOT NULL,
`descripcion` text NOT NULL,
`observaciones` text NOT NULL,
`fecha_factura` date NOT NULL,
`precio` float NOT NULL,
`importe_descuento` float NOT NULL,
`descuento_global` float NOT NULL,
`iva` float NOT NULL,
`franquicia` float NOT NULL default '0',
`tipo_pago` varchar(15) NOT NULL default 'Al contado',
`anio_presupuesto` int(4) NOT NULL,
`id_presupuesto` int(10) unsigned NOT NULL,
PRIMARY KEY (`id_factura`,`anio`),
KEY `id_presupuesto` (`id_presupuesto`),
KEY `anio_presupuesto` (`anio_presupuesto`),
CONSTRAINT `facturas_ibfk_1` FOREIGN KEY (`id_presupuesto`) REFERENCES `presupuestos` (`id_presupuesto`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=latin1;




CREATE TABLE `presupuestos` (
`id_presupuesto` int(10) unsigned NOT NULL,
`anio` int(4) NOT NULL,
`descripcion` text NOT NULL,
`observaciones` text NOT NULL,
`fecha_presupuesto` date NOT NULL,
`precio` float NOT NULL,
`importe_descuento` float NOT NULL default '0',
`descuento_global` float NOT NULL,
`iva` float NOT NULL,
`franquicia` float NOT NULL default '0',
`tipo` varchar(50) NOT NULL,
`id_averia` int(10) unsigned NOT NULL,
PRIMARY KEY (`id_presupuesto`,`anio`),
KEY `id_averia` (`id_averia`),
KEY `tipo` (`tipo`),
CONSTRAINT `presupuestos_ibfk_1` FOREIGN KEY (`id_averia`) REFERENCES `resguardo_deposito` (`id_averia`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=latin1;



como se puede ver el foreing key de facturas esta mal, ademas de relacionar el id se deberia de relacionar el año.

He elimidado el foreign key con la siguiente instruccion: ALTER TABLE facturas DROP FOREIGN KEY facturas_ibfk_1;
Lo que ahora nose es añadr el foreign key correcto con el id y el año

Etiquetas: key, tabla, alterar, foreignkey
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 05:25.