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

llaves primarias y foreaneas

Estas en el tema de llaves primarias y foreaneas en el foro de Mysql en Foros del Web. tengo esta estructura: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código MySQL: Ver original create table facturasxcontratos ( idcontrato varchar ( 45 ) not null , valorcontrato int ( 50 ...
  #1 (permalink)  
Antiguo 05/02/2013, 09:41
Avatar de andres_15_  
Fecha de Ingreso: septiembre-2008
Ubicación: Cali
Mensajes: 232
Antigüedad: 15 años, 6 meses
Puntos: 7
llaves primarias y foreaneas

tengo esta estructura:

Código MySQL:
Ver original
  1. create table facturasxcontratos(
  2. idcontrato varchar(45) not null,
  3. valorcontrato int(50) not null,
  4. idfactura varchar(45) not null,
  5. valorfactura int(50) not null,
  6. total int(60) not null,
  7. foreign key(idcontrato)
  8. references contratos(idcontrato),
  9. foreign key(idfactura)
  10. references facturas(idfactura)
  11.  
  12. );

el problema es que como tengo los datos en las tablas madres me permite ingresar los datos siempre y cuando existan.

lo que quiero es que si existe el numero de contrato 1 y la factura 1, solo me los deje ingresar una vez por factura, es decir que en la proxima fila se puede insertar de nuevo el numero de contrato pero la factura no sera 1 si no 2

agrego que tambien probre asi:

Código MySQL:
Ver original
  1. create table facturasxcontratos(
  2. idcontrato varchar(45) not null,
  3. valorcontrato int(50) not null,
  4. idfactura varchar(45) not null,
  5. valorfactura int(50) not null,
  6. total int(60) not null,
  7. primary key(idcontrato,idfactura),
  8. foreign key(idcontrato)
  9. references contratos(idcontrato),
  10. foreign key(idfactura)
  11. references facturas(idfactura)
  12.  
  13. );

al ingresar los 2 primeros datos me da bien pero voy a insertar un tercer dato y me dice "Error Code: 1062. Duplicate entry '1-3' for key 'PRIMARY'
", pero los campos que tengo son :
Cita:
1 5000 1 1000 4000
1 5000 2 1000 3000

Última edición por andres_15_; 05/02/2013 a las 09:50
  #2 (permalink)  
Antiguo 05/02/2013, 09:52
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 2 meses
Puntos: 447
Respuesta: llaves primarias y foreaneas

Hola andres_15_:

Creo que para este caso tendrías que utilizar un TRIGGER (Disparadores)... ¿por qué no le das un vistazo a la documentación oficial?:

http://dev.mysql.com/doc/refman/5.0/...e-trigger.html

Si tienes dudas también puedes preguntarle a SAN GOOGLE por algunos ejemplos prácticos... si continuas con problemas postea algo de lo que intentaste hacer y con gusto te ayudamos a completar lo que falte o a corregir lo que esté mal.

Saludos
Leo.
  #3 (permalink)  
Antiguo 05/02/2013, 10:01
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 2 meses
Puntos: 447
Respuesta: llaves primarias y foreaneas

Hola de nuevo andres_15_:

También es conveniente que nos digas qué valores son los que intentaste ingresar como tercer registro... creo que la idea de la llave compuesta podría funcionar, pues el error que te aparece es de una llave duplicada, pero habría que tener un contexto más amplio.

Saludos
Leo.
  #4 (permalink)  
Antiguo 05/02/2013, 10:11
Avatar de andres_15_  
Fecha de Ingreso: septiembre-2008
Ubicación: Cali
Mensajes: 232
Antigüedad: 15 años, 6 meses
Puntos: 7
Respuesta: llaves primarias y foreaneas

Cita:
Iniciado por leonardo_josue Ver Mensaje
Hola de nuevo andres_15_:

También es conveniente que nos digas qué valores son los que intentaste ingresar como tercer registro... creo que la idea de la llave compuesta podría funcionar, pues el error que te aparece es de una llave duplicada, pero habría que tener un contexto más amplio.

Saludos
Leo.
Leo estos son los campos a ingresar:

Cita:
1 5000 3 1000 y el saldo deberia quedar: 2000
No se porque me dice ese error
  #5 (permalink)  
Antiguo 05/02/2013, 14:29
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: llaves primarias y foreaneas

Andres_15_
veo que sigues con el tema que trataste en otro post. No has querido seguir el consejo de calcular el total que queda de un contrato y te empeñas en restar y usar para ello una tabla en la que almacenas varios datos, el idcontrato, el valor contrato, e imagino que el idfactura de la última factura cuyo valor desquitas. Leo te sugirió con buen criterio el empleo de trigger para tras insertar una factura actualizar esa tabla de totales, restando el valor.
Mira aquí:
http://dev.mysql.com/doc/refman/5.0/en/triggers.html
En ese caso, podrías al actualizar restar el total y guardar el idfactura de la última factura, y no serían necesarias las restricciones. Al fin y al cabo esta tabla solo te sirve para obtener el total y mantenerlo almacenado. No hay necesidad de relacionar con las otras dos tablas y mantener esas restricciones.
Sigo pensando que no es necesario nada de esto, pues tú cuando quieras saber el total, tendrás que lanzar una consulta a una tabla con un solo registro, porque no creo que quieras guardar un registro con el histórico de la resta de cada factura sobre el total, porque podría llevarte a confusión al tener varios registros para un mismo contrato. Todo esto lo podrías obtener como te recomendé en el otro post con una simple consulta de agrupado, sin usar ninguna tabla más, sin añadir trigger alguno, sin almacenar datos innecesarios, y sin tener que preocuparte de cuál fue la última factura que entró, etc. Esto es lo que pienso, pero si quieres probar los triggers, adelante. Yo quitaría las restricciones que no tendrían a mi juicio casi ningún sentido, si bien creo que en el caso del trigger quizás no te daría el error pues primero sería la inserción en factura y luego en esta tabla de totales.
  #6 (permalink)  
Antiguo 05/02/2013, 14:38
Avatar de andres_15_  
Fecha de Ingreso: septiembre-2008
Ubicación: Cali
Mensajes: 232
Antigüedad: 15 años, 6 meses
Puntos: 7
Respuesta: llaves primarias y foreaneas

Cita:
Iniciado por jurena Ver Mensaje
Andres_15_
veo que sigues con el tema que trataste en otro post. No has querido seguir el consejo de calcular el total que queda de un contrato y te empeñas en restar y usar para ello una tabla en la que almacenas varios datos, el idcontrato, el valor contrato, e imagino que el idfactura de la última factura cuyo valor desquitas. Leo te sugirió con buen criterio el empleo de trigger para tras insertar una factura actualizar esa tabla de totales, restando el valor.
Mira aquí:
http://dev.mysql.com/doc/refman/5.0/en/triggers.html
En ese caso, podrías al actualizar restar el total y guardar el idfactura de la última factura, y no serían necesarias las restricciones. Al fin y al cabo esta tabla solo te sirve para obtener el total y mantenerlo almacenado. No hay necesidad de relacionar con las otras dos tablas y mantener esas restricciones.
Sigo pensando que no es necesario nada de esto, pues tú cuando quieras saber el total, tendrás que lanzar una consulta a una tabla con un solo registro, porque no creo que quieras guardar un registro con el histórico de la resta de cada factura sobre el total, porque podría llevarte a confusión al tener varios registros para un mismo contrato. Todo esto lo podrías obtener como te recomendé en el otro post con una simple consulta de agrupado, sin usar ninguna tabla más, sin añadir trigger alguno, sin almacenar datos innecesarios, y sin tener que preocuparte de cuál fue la última factura que entró, etc. Esto es lo que pienso, pero si quieres probar los triggers, adelante. Yo quitaría las restricciones que no tendrían a mi juicio casi ningún sentido, si bien creo que en el caso del trigger quizás no te daría el error pues primero sería la inserción en factura y luego en esta tabla de totales.
Hola jurena , no es que no haya querido seguir las instrucciones y estoy de acuerdo con lo que dices, pero lo que yo estoy tratando de hacer no es para mi , si no para una persona que quiere ver los campos que ya dije antes (numero de el contrato, el valor de el contrato, numero de la factura y el valor de la factura y el total de como va bajando el saldo de el contrato). lo de los triggers lo leí un poco y no entendi muy bien, pues la verdad tengo conocimientos muy básicos en bases de datos. Si tal vez hay alguna forma te agradeceria jurena, aunque ya debes estar diciendo "la @#$% lo va a ayudar " jajaajaja
  #7 (permalink)  
Antiguo 05/02/2013, 14:49
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: llaves primarias y foreaneas

Andres_15_
Una pregunta más y un consejo. Si hay varias facturas de un contrato ¿cuántos registros de ese contrato se guardan en esa tabla de totales, solo uno por contrato, o tantos como facturas de ese contrato haya?
Respecto al trigger, yo no trabajo mucho con ellos y te recomendaría que abrieras un nuevo post para pedir ayuda sobre cómo crear un trigger en el que al insertar un valor en una tabla, actualice los valores de un registro en otra, o inserte otro registro en otra tabla.
Y no te preocupes, aquí estamos para ayudar, todos. Por eso no conviene personalizar las peticiones, pues otros foreros se cortan a la hora de ayudar, al entender que se trata de un diálogo entre solo dos personas del foro. Pero responde antes a esta pregunta, pues te hará pensar seguro en la estructura que te han pedido. Piensa que hay otras formas si es que quieres mostrar ordenadas las facturas y los saldos del contrato, si tienes un campo fecha en las facturas seguro que usando variables también podrías mostrar los totales tras restar cada una de las facturas, aunque no estaría almacenado, claro.
  #8 (permalink)  
Antiguo 05/02/2013, 14:57
Avatar de andres_15_  
Fecha de Ingreso: septiembre-2008
Ubicación: Cali
Mensajes: 232
Antigüedad: 15 años, 6 meses
Puntos: 7
Respuesta: llaves primarias y foreaneas

Cita:
Iniciado por jurena Ver Mensaje
Andres_15_
Una pregunta más y un consejo. Si hay varias facturas de un contrato ¿cuántos registros de ese contrato se guardan en esa tabla de totales, solo uno por contrato, o tantos como facturas de ese contrato haya?
Respecto al trigger, yo no trabajo mucho con ellos y te recomendaría que abrieras un nuevo post para pedir ayuda sobre cómo crear un trigger en el que al insertar un valor en una tabla, actualice los valores de un registro en otra, o inserte otro registro en otra tabla.
Y no te preocupes, aquí estamos para ayudar, todos. Por eso no conviene personalizar las peticiones, pues otros foreros se cortan a la hora de ayudar, al entender que se trata de un diálogo entre solo dos personas del foro. Pero responde antes a esta pregunta, pues te hará pensar seguro en la estructura que te han pedido. Piensa que hay otras formas si es que quieres mostrar ordenadas las facturas y los saldos del contrato, si tienes un campo fecha en las facturas seguro que usando variables también podrías mostrar los totales tras restar cada una de las facturas, aunque no estaría almacenado, claro.
¡esa era la pregunta! , y la respuesta es que si, hay tantas facturas como de ese contrata hayan. Por eso necesitaba que todo me quedara en una tabla jurena
  #9 (permalink)  
Antiguo 05/02/2013, 15:10
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: llaves primarias y foreaneas

Esas tablas no están bien normalizadas (fíjate que guardas el valor de la factura en dos lugares, en la tabla factura y en la tabla esa de totales), pero si te empeñas en tenerlo así...
yo recurriría a programación: tras insertar una nueva factura para un contrato, luego busco el último registro de ese contrato en totales (importante un campo de fecha, un timestamp current_timestamp, aunque también podrías usar un int auto_increment si lo usas como primary key), guardo en memoria el valor del contrato en el registro de la última factura almacenada, e inserto otro nuevo registro para ese contrato, con el número de la nueva factura y en valor de contrato le resto el valor de la nueva factura. Primero tendrás que insertar en factura, no lo olvides.
  #10 (permalink)  
Antiguo 06/02/2013, 16:05
Avatar de andres_15_  
Fecha de Ingreso: septiembre-2008
Ubicación: Cali
Mensajes: 232
Antigüedad: 15 años, 6 meses
Puntos: 7
Respuesta: llaves primarias y foreaneas

lo intentare, gracias jurena :D

Etiquetas: llaves, 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 23:06.