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

Problema con ALTER TABLE (creo) [Solucionado]

Estas en el tema de Problema con ALTER TABLE (creo) [Solucionado] en el foro de Mysql en Foros del Web. Buenas compañero-as. Os cuento un problema que tengo a ver si alguno-a pudiera echarme una mano. Doy de alta una base de datos donde le ...
  #1 (permalink)  
Antiguo 16/11/2009, 16:51
 
Fecha de Ingreso: abril-2009
Mensajes: 72
Antigüedad: 15 años
Puntos: 0
Pregunta Problema con ALTER TABLE (creo) [Solucionado]

Buenas compañero-as.

Os cuento un problema que tengo a ver si alguno-a pudiera echarme una mano.

Doy de alta una base de datos donde le doy unas restricciones (en este caso ON UPDATE CASCADE) y luego trato de incluir algunos elementos a una de sus tablas.

Os dejo un ejemplo de algunas tablas de las que utilizo:

Código:
DROP DATABASE IF EXISTS Entradas
;
CREATE DATABASE Entradas
;

USE Entradas
;


DROP TABLE IF EXISTS Fuente
;
DROP TABLE IF EXISTS Categoria
;
DROP TABLE IF EXISTS Entrada
;


CREATE TABLE Fuente
(
	id_fuente INTEGER NOT NULL AUTO_INCREMENT,
	nombre_fuente VARCHAR(250) NOT NULL,
	resumen VARCHAR(255),
	PRIMARY KEY (id_fuente, nombre_fuente)
) 
;


CREATE TABLE Categoria
(
	id_categoria INTEGER NOT NULL AUTO_INCREMENT,
	nombre_categoria VARCHAR(50) NOT NULL,
	PRIMARY KEY (id_categoria, nombre_categoria)
) 
;


CREATE TABLE Entrada
(
	id_entrada INTEGER NOT NULL AUTO_INCREMENT,
	nombre_entrada VARCHAR(100) NOT NULL,
	nombre_categoria VARCHAR(50),
	nombre_fuente VARCHAR(250),
	PRIMARY KEY (id_entrada, nombre_entrada),
	KEY (nombre_categoria),
	KEY (nombre_fuente)
) 
;


ALTER TABLE Entrada ADD CONSTRAINT FK_Entrada_Categoria 
	FOREIGN KEY (nombre_categoria) REFERENCES Categoria (id_categoria, nombre_categoria)
	ON UPDATE CASCADE
;

ALTER TABLE Entrada ADD CONSTRAINT FK_Entrada_Fuente 
	FOREIGN KEY (nombre_fuente) REFERENCES Fuente (id_fuente, nombre_fuente)
	ON UPDATE CASCADE
;


INSERT INTO `categoria` (`id_categoria`, `nombre_categoria`) VALUES 
  (1, 'Conciertos'),
  (2, 'Teatro'),
  (3, 'Cine'),
  (4, 'Misical');
El caso es que no consigo que realice la restricción, osea, cuando modifico algún elemento en la tabla categoria no se modifica este mismo elemento en las otras tablas, es como si no me hubiese cogido el codigo del ALTER TABLE, sin embargo no obtengo ningún mensaje de error ni nada por el estilo.

Y tampoco consigo que me dé de alta los elementos que le pongo a la tabla "categoria".

No sé si estoy poniendo algo mal en el DDL, me he mirado los apuntes que tenia por aquí y no encuentro que tenga algo mal.

Espero podais echarme una mano.

Un saludo.
Alex.

Última edición por Alexand3r; 16/11/2009 a las 20:45 Razón: solucionado
  #2 (permalink)  
Antiguo 16/11/2009, 18:00
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, 5 meses
Puntos: 2658
Respuesta: Problema con ALTER TABLE (creo)

hay varias observaciones para hacer:
1) ON UPDATE CASCADE implica que si hay alguna modificación (UPDATE) en la PK de la tabla CATEGORIA, por ejemplo, si hay algún registro en ENTRADA que esté relacionado con uno de la categoría modificada, este se modifique en cascada. El tema pasa porque:
a. Lo único que se actualiza es la PK si esta ha sido modificada.
b. Solamente afecta a aquellos registros existentes en ese momento en ENTRADA que se correspondan con la PK modificada en CATEGORIA. Ninguno más.

2) Las FK tal y como las defines simplemente no pueden existir. Deben estar dándote error al crearla, porque una FK debe corresponder exactamente con la PK original. En el caso que planteas, la PK es compuesta (dos campos), por lo tanto la FK también debe ser compuesta, es decir, deben ser dos campos y no uno, del mismo tipo y en el mismo orden.

3) Un campo autoincremental es por default PK por si mismo. No necesita de otro campo para definirla. La PK definida en CATEGORIA es innecesariamente compleja. No necesita los dos campos, además de que tal como la planteas no impide que se ingresen dos categorías con el mismo nombre... porque tendrán autoincrementales diferentes.
En todo caso lo que tienes que hacer es declarar UNIQUE al nombre, pero no hacerlo parte de la PK; o bien eliminar el autoincremental como PK, porque con el nombre sería suficiente.

Finalmente: No nos estás indicando el tipo de tabla usado. Esto es importante porque si son MyISAM, las MyISAM no soportan restricciones de FK.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 16/11/2009 a las 19:07
  #3 (permalink)  
Antiguo 16/11/2009, 19:25
 
Fecha de Ingreso: abril-2009
Mensajes: 72
Antigüedad: 15 años
Puntos: 0
Respuesta: Problema con ALTER TABLE (creo)

Wow gnzsoloyo, muchas gracias por tu respuesta.

Lo que me pasaba, era que no obtenia ningún tipo de error al crear las tablas, me las creaba perfectamente, solo que no me realizaba nada del DDL a partir de los ALTER..., y por consiguiente tampoco sabia exactamente lo que estaba haciendo mal.

Bueno, creo que voy ponerme manos a la obra y a aplicar aquellas cosas que me has dicho. Cualquier cosa, te comento.

Muchas gracias nuevamente, siempre estais ahí dispuesto a echar una mano.

Un saludo.

Alex.
  #4 (permalink)  
Antiguo 16/11/2009, 20:51
 
Fecha de Ingreso: abril-2009
Mensajes: 72
Antigüedad: 15 años
Puntos: 0
Respuesta: Problema con ALTER TABLE (creo) [Solucionado]

gnzsoloyo, muchas gracias.

He conseguido solucionar todos los problemas que tú me comentabas.

Claro, yo pensaba que al tener aparte del id, el nombre_xxxxx como llave primaria, le estaba aplicando lo de llave unica, pero cierto, que al tener los dos como llaves primarias, estaba aplicando la llave a ambos juntos, pudiendose repetir el mismo nombre, pero con otro id.

Ademas, yo pensaba erroneamente que para ser llave foranea tenia que ser primaria, y bastaria con que fuesen unicas, de ahi que tambien cogia el nombre_xxxxx como primaria también.

Lo hice todo como me has dicho, una sola llave primaria, en este caso el id_xxxx, y el nombre_xxxxxx como unico, y una única llave foranea, el nombre de categoria para las dos tablas.

Y así ya me ha cogido tambien el INSERT INTO.

Muchas gracias, me has sido de gran ayuda.

Un saludo.

Alex.
  #5 (permalink)  
Antiguo 17/11/2009, 04:28
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, 5 meses
Puntos: 2658
Respuesta: Problema con ALTER TABLE (creo) [Solucionado]

Me alegro que se haya solucionado.

Saludos
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
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 18:00.