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

Tabla de clave primaria compuesta y foraneas

Estas en el tema de Tabla de clave primaria compuesta y foraneas en el foro de Mysql en Foros del Web. Buenas, he creado una tabla que relaciona varias, es decir, de una relación N:N. El problema es que la generaba por phpmyadmin y en el ...
  #1 (permalink)  
Antiguo 24/02/2014, 05:22
 
Fecha de Ingreso: noviembre-2012
Mensajes: 184
Antigüedad: 12 años
Puntos: 0
Tabla de clave primaria compuesta y foraneas

Buenas, he creado una tabla que relaciona varias, es decir, de una relación N:N.
El problema es que la generaba por phpmyadmin y en el apartado indices me salía como me añadía las relaciones y las claves primarias correctamente, pero investigando el código SQL veía algo raro:

Código:
--
-- Estructura de tabla para la tabla `se_descuenta`
--

CREATE TABLE IF NOT EXISTS `se_descuenta` (
  `activ` tinyint(3) unsigned NOT NULL,
  `oferta` tinyint(3) unsigned NOT NULL,
  `pvp` decimal(5,2) unsigned NOT NULL,
  PRIMARY KEY (`activ`,`oferta`),
  KEY `oferta` (`oferta`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Restricciones para tablas volcadas
--

--
-- Filtros para la tabla `se_descuenta`
--
ALTER TABLE `se_descuenta`
  ADD CONSTRAINT `se_descuenta_ibfk_1` FOREIGN KEY (`oferta`) REFERENCES `oferta` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
  ADD CONSTRAINT `se_descuenta_ibfk_2` FOREIGN KEY (`activ`) REFERENCES `actividad` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
Me refiero por raro, algo que no se si es correcto...
Me añade solamente una clave después de la PK y después modifica la tabla añadiendo ambas claves foráneas.

Al ver esto, lo que hice fue crear mediante código la tabla de la siguiente forma:
Código:
CREATE TABLE IF NOT EXISTS `se_descuenta` (
 `activ` tinyint(3) unsigned NOT NULL,
 `oferta` tinyint(3) unsigned NOT NULL,
 `pvp` decimal(5,2) unsigned NOT NULL,
FOREIGN KEY (`oferta`) REFERENCES `oferta` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (`activ`) REFERENCES `actividad` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
 PRIMARY KEY (`activ`,`oferta`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
De esta forma me generaba el mismo resultado, me refiero que al exportar la tabla para ver el código me mostraba el primero que posteo.

No se si es correcto y es problema de PHPmyAdmin o es que estoy cometiendo algún error.

Espero vuestras respuestas! Un saludo.
  #2 (permalink)  
Antiguo 24/02/2014, 06:11
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 8 meses
Puntos: 574
Respuesta: Tabla de clave primaria compuesta y foraneas

No es un problema simpre que restaures las copias enteras....


Un backup de una base de datos es un script que se ejecuta secuencialmente, creación de tabla seguido de inserción de datos. En muchos casos si se crean las tablas con todas sus retricciones (CONSTRAINTs) no se podría restauarar la base....

Supongamos que tenemos las tabla A,B,C donde hay una relacion N:M entre A y C con B como tabla de relación.... El backup se hace por orden afabético....

Al restaurar el backup, si intentamos crear la tabla B con todas sus reticciones, no podremos ni crearla ya que una de sus restricciones es una FK que referencia a C, una tabla que aún no existe. La solución es crear las tablas e insertar los datos sin restricciones y luego crear las restricciones, como los datos la cumplen las restricciones no habrá ningún problema.

Si usas vistas tambien se puede producir una situación similar, si en la definición de una vista usas otra vista con un nombre "alfabeticamente superior". En este caso no se podra crear la vista ya que usa una vista que aún no existe. Para solucionar este caso primero se crean tablas, sin datos ni restricciones, con los mismos nombres y campos que las vistas, de manera que el objeto exista y no genere problemas al crear una vista anterior, antes de crear la vista real se elemina la tabla con el mismo nombre....
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 24/02/2014 a las 06:49
  #3 (permalink)  
Antiguo 24/02/2014, 06:51
 
Fecha de Ingreso: noviembre-2012
Mensajes: 184
Antigüedad: 12 años
Puntos: 0
Respuesta: Tabla de clave primaria compuesta y foraneas

Buenas Quim!
no me refería al tema de backups, sino en la creación de tablas de mi BD, que digamos phpmyadmin me genera en el apartado indices uno PRIMARY KEY formado por el atributo activ y oferta y cuando lo relaciono cada atributo con su referencia nada más me aparece un indice más, aunque las relaciones estén correctas.
No se si es porque considera cuando hay una calve primaria compuesta un atributo ya como index (el primero que se selecciona) o es que realmente lo hace mal.

*NOTA: Si pudiera subir una imagen sería lo suyo pero no se si puedo.

Un saludo y gracias por tu colaboración.

Etiquetas: clave, compuesta, null, php, primaria, sql, tabla
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 11:15.