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

[/B] Ayuda ... porfavor PRIMARY KEY[/B]

Estas en el tema de [/B] Ayuda ... porfavor PRIMARY KEY[/B] en el foro de Mysql en Foros del Web. Hola a todos ¡! [B]El problema que obtengo es que al intentar introducir el segundo producto en la tabla “pedidoprod” no puedo repetir “numped” que ...
  #1 (permalink)  
Antiguo 18/08/2010, 18:46
 
Fecha de Ingreso: octubre-2008
Mensajes: 9
Antigüedad: 15 años, 6 meses
Puntos: 0
[/B] Ayuda ... porfavor PRIMARY KEY[/B]

Hola a todos ¡!

[B]El problema que obtengo es que al intentar introducir el segundo producto en la tabla “pedidoprod” no puedo repetir “numped” que es la PK (entiendo que la PK es irrepetible) entonces como puedo ingresar mas productos? Quiero decir, como podría ingresar un 2do, 3ro y mas productos, si todos ellos pertenecen al mismo numero de pedido? [B]

Podría alguien ayudarme, porfavor … He tomado este ejemplo ya normalizado de Internet:

Si desean ver el ejemplo se encuentra en el siguiente link:

http://www.youtube.com/watch?v=-HajWU4pDLM

La tabla es la siguiente:

https://www3.snapfish.co.uk/snapfishuk/shareeloginsubmit/p=77161282002879073/l=1575472011/g=5248506011/cobrandOid=1007/COBRAND_NAME=snapfishuk/otsc=SYE/otsi=SABE/pns/snapfishuk/share/p=77161282002879073/l=1575472011/g=5248506011/cobrandOid=1007/COBRAND_NAME=snapfishuk/otsc=SYE/otsi=SABE

Como ustedes podrán observar he borrado la fecha. La razón por la cual no la tengo en cuenta es porque esta no es relevancia ni tomada en cuenta para la calificación de este trabajo.

Las tablas obtenidas son las siguientes:

Tercera Forma Normal (3NF)
PEDIDO (numped(PK), numprov(FK), mtotlped)
PEDIDOPROD (numped(PK), numprod(FK), cantped, subtlprod)
PRODUCTO (numprod(PK), descprod, preuniprod)
PROVEEDOR (numprov(PK), nomprov, dirprov)

La sintaxis es la siguiente:

CREATE TABLE proveedor (
numprov int(20) not null,
nomprov varchar(20) not null,
dirprov varchar(20) not null,
PRIMARY KEY(numprov)
)
ENGINE =InnoDB;

CREATE TABLE producto (
numprod int(20) not null,
descprod varchar(20) not null,
preuniprod int(20) not null,
PRIMARY KEY(numprod)
)
ENGINE =InnoDB;

CREATE TABLE pedidoprod (
numped int(20) not null,
numprod int(20) not null,
cantped int(20) not null,
subtlprod int(20) not null,
PRIMARY KEY(numped),
Index(numprod),
FOREIGN KEY(numprod) REFERENCES producto (numprod)
ON UPDATE CASCADE ON DELETE CASCADE )
ENGINE =InnoDB;

CREATE TABLE pedido (
numped int(20) not null,
numprov int(20) not null,
mtotlped int(20) not null,
PRIMARY KEY(numped),
Index(numprov),
FOREIGN KEY(numprov) REFERENCES proveedor (numprov)
ON UPDATE CASCADE ON DELETE CASCADE )
ENGINE =InnoDB;

[B]El problema que obtengo es que al intentar introducir el segundo producto en la tabla “pedidoprod” no puedo repetir “numped” que es la PK (entiendo que la PK es irrepetible) entonces como puedo ingresar mas productos? Quiero decir, como podría ingresar un 2do, 3ro y mas productos, si todos ellos pertenecen al mismo numero de pedido? [B]

Porfavor podría alguien ayudarme ¡!!!! Agradezco inmensamente su colaboración y tiempo.
  #2 (permalink)  
Antiguo 19/08/2010, 10:51
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: [/B] Ayuda ... porfavor PRIMARY KEY[/B]

Sincos como estas?

Tu problema está en el diseño de la base de datos.

Viendo por encima tu problema, pedidoprod es una tabla resultante de una relación n-m entre productos y pedido.
Por esta razón no puedes poner en la tabla pedidoprod el campo numped como priomary key. debería ser también llave foranea de la tabla pedidos.

quedaría
Código MySQL:
Ver original
  1. CREATE TABLE pedidoprod (
  2. numped int(20) not null,
  3. numprod int(20) not null,
  4. cantped int(20) not null,
  5. subtlprod int(20) not null,
  6. FOREIGN KEY(numped) REFERENCES pedido (numped)
  7. Index(numprod),
  8. FOREIGN KEY(numprod) REFERENCES producto (numprod)

De esta forma si te dejará ingresar los valores.

Nos cuentas como te va.


saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 19/08/2010, 11:26
 
Fecha de Ingreso: octubre-2008
Mensajes: 9
Antigüedad: 15 años, 6 meses
Puntos: 0
Respuesta: [/B] Ayuda ... porfavor PRIMARY KEY[/B]

Su respuesta me ha ayudado a solucionar mi problema ... Muchisimas gracias
  #4 (permalink)  
Antiguo 19/08/2010, 22:20
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: [/B] Ayuda ... porfavor PRIMARY KEY[/B]

Me parece que este tema ya se trató aquí, pero evidentemente no se entendió la respuesta...
Lo que normalmente se hace:
Código MySQL:
Ver original
  1. /***********************************************************************************************************/
  2.  
  3. DROP TABLE IF EXISTS `producto`;
  4. CREATE TABLE  `producto` (
  5.   `numprod` int(20) unsigned NOT NULL,
  6.   `descprod` varchar(20) NOT NULL,
  7.   `preuniprod` int(20) unsigned NOT NULL,
  8.   PRIMARY KEY  (`numprod`)
  9.  
  10. /***********************************************************************************************************/
  11.  
  12. DROP TABLE IF EXISTS `proveedor`;
  13. CREATE TABLE  `proveedor` (
  14.   `numprov` int(20) unsigned NOT NULL,
  15.   `nomprov` varchar(20) NOT NULL,
  16.   `dirprov` varchar(20) NOT NULL,
  17.   PRIMARY KEY  (`numprov`)
  18.  
  19. /***********************************************************************************************************/
  20.  
  21. DROP TABLE IF EXISTS `pedido`;
  22. CREATE TABLE  `pedido` (
  23.   `numped` int(20) unsigned NOT NULL,
  24.   `numprov` int(20) unsigned NOT NULL,
  25.   `mtotlped` int(20) unsigned NOT NULL,
  26.   PRIMARY KEY  (`numped`),
  27.   KEY `numprov` (`numprov`),
  28.   CONSTRAINT `FK_pedido_proveedor` FOREIGN KEY (`numprov`)
  29.   REFERENCES `proveedor` (`numprov`) ON DELETE CASCADE ON UPDATE CASCADE
  30.  
  31. /***********************************************************************************************************/
  32.  
  33. DROP TABLE IF EXISTS `pedidoprod`;
  34. CREATE TABLE  `pedidoprod` (
  35.   `numped` int(20) unsigned NOT NULL,
  36.   `subitemped` int(20) unsigned NOT NULL,
  37.   `numprod` int(20) unsigned NOT NULL,
  38.   `cantped` int(20) unsigned NOT NULL,
  39.   `subtlprod` int(20) unsigned NOT NULL,
  40.   PRIMARY KEY  USING BTREE (`numped`,`subitemped`),
  41.   KEY `numprod` (`numprod`),
  42.   CONSTRAINT `FK_pedidoprod_prod` FOREIGN KEY (`numprod`)
  43.   REFERENCES `producto` (`numprod`) ON DELETE CASCADE ON UPDATE CASCADE,
  44.   CONSTRAINT `FK_pedidoprod_nroped` FOREIGN KEY (`numped`)
  45.   REFERENCES `pedido` (`numped`) ON DELETE CASCADE ON UPDATE CASCADE
  46. /***********************************************************************************************************/
  47. /* Y para completar.. el TRIGGER que puede numerar los subitems, si po ocio no quieres manejarlo tu mismo. */
  48. /***********************************************************************************************************/
  49. DROP TRIGGER IF EXISTS subitempedido;
  50. DELIMITER $$
  51. CREATE TRIGGER subitempedido BEFORE INSERT
  52. ON pedidoprod
  53.         IF(SELECT MAX(subitemped) FROM pedidoprod WHERE numped = NEW.numped) IS NULL THEN
  54.       SET NEW.subitemped = 1;
  55.     ELSE
  56.       SET NEW.subitemped=(SELECT MAX(subitemped) FROM pedidoprod WHERE numped = NEW.numped) + 1;
  57.     END IF;
  58. END$$
  59.  
  60. DELIMITER ;
__________________
¿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 20/08/2010, 19:06
 
Fecha de Ingreso: octubre-2008
Mensajes: 9
Antigüedad: 15 años, 6 meses
Puntos: 0
Respuesta: [/B] Ayuda ... porfavor PRIMARY KEY[/B]

Muchas gracias a huesos52 y gnzsoloyo por sus respuestas, colaboración y tiempo.

Etiquetas: Ninguno
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 01:41.