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

update con un insert

Estas en el tema de update con un insert en el foro de Mysql en Foros del Web. buen día a todos, tengo el siguiente script: Código: update totalcontratos t inner join facturas f on t.idcontrato=f.nfactura set total=t.total-f.valorfactura where f.valorfactura=2; lo que quiero ...
  #1 (permalink)  
Antiguo 04/02/2013, 10:23
Avatar de andres_15_  
Fecha de Ingreso: septiembre-2008
Ubicación: Cali
Mensajes: 232
Antigüedad: 15 años, 7 meses
Puntos: 7
update con un insert

buen día a todos, tengo el siguiente script:

Código:
update totalcontratos t
inner join facturas f on t.idcontrato=f.nfactura
set total=t.total-f.valorfactura
where f.valorfactura=2;
lo que quiero es coger la tabla totalcontratos y actualizarle el total con una nueva factura que ingrese, es decir tomar el total de la tabla totalcontratos (que es la misma que voy a actualizar) y restarle el valor de la tabla facturas.

La cuestión es que no se si asi esta bien. Tambien agrego que me aperece esto:
"Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column To disable safe mode, toggle the option in Preferences -> SQL Editor -> Query Editor and reconnect."

Ya segui la ruta pero no me aparece la opción Query Editor and reconnect .muchas gracias por las ayudas de antemano
  #2 (permalink)  
Antiguo 04/02/2013, 10:48
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: update con un insert

Andres_15_
Fíjate en lo que quiere hacer tu consulta:
Unes registros de las tablas totalcontratos y facturas cuando haya coincidencia entre t.idcontrato=f.nfactura y luego le restas a total de totalcontratos el valorfactura de facturas, y lo haces siempre que el valorfactura de facturas sea 2. Haría la resta sobre todos los contratos que tuvieran relacionado un valorfactura de la tabla facturas = 2, y creo que eso no es lo que quieres. El MySQL parece ver el problema y te pide que hagas un update sobre un campo que esté indexado KEY. Lo lógico que es que lo hicieras el WHERE sobre el nfactura o el idcontrato en el que estés trabajando, y que esos estén indexados y que sean solo uno (me refiero al contrato). Pregúntante si es lo que quieres hacer
  #3 (permalink)  
Antiguo 04/02/2013, 11:00
Avatar de andres_15_  
Fecha de Ingreso: septiembre-2008
Ubicación: Cali
Mensajes: 232
Antigüedad: 15 años, 7 meses
Puntos: 7
Respuesta: update con un insert

Cita:
Iniciado por jurena Ver Mensaje
Andres_15_
Fíjate en lo que quiere hacer tu consulta:
Unes registros de las tablas totalcontratos y facturas cuando haya coincidencia entre t.idcontrato=f.nfactura y luego le restas a total de totalcontratos el valorfactura de facturas, y lo haces siempre que el valorfactura de facturas sea 2. Haría la resta sobre todos los contratos que tuvieran relacionado un valorfactura de la tabla facturas = 2, y creo que eso no es lo que quieres. El MySQL parece ver el problema y te pide que hagas un update sobre un campo que esté indexado KEY. Lo lógico que es que lo hicieras el WHERE sobre el nfactura o el idcontrato en el que estés trabajando, y que esos estén indexados y que sean solo uno (me refiero al contrato). Pregúntante si es lo que quieres hacer
si, tenias razon tenia algo malo(pero no me ha dado ). Lo que quiero hacer es restarle el valor de la factura al saldo que quedo del contrato, por eso quiero actualizar este saldo con un update que sea solo para el contrato asignado y el numero de factura que esta conectado con esa tabla contratos.No se si me haga entender
  #4 (permalink)  
Antiguo 04/02/2013, 11:08
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: update con un insert

Sí, pero para eso tienes que poner en el WHERE la referencia al número de contrato o al de factura
... WHERE t.idcontrato = @idcontratoquesea AND f.nfactura = @numfacturaquesea

De este modo evitaras que reste el valor de factura que no se deba y al contrato que no se deba

Haz pruebas para ver si es lo que quieres...
  #5 (permalink)  
Antiguo 04/02/2013, 14:15
Avatar de andres_15_  
Fecha de Ingreso: septiembre-2008
Ubicación: Cali
Mensajes: 232
Antigüedad: 15 años, 7 meses
Puntos: 7
Respuesta: update con un insert

Cita:
Iniciado por jurena Ver Mensaje
Sí, pero para eso tienes que poner en el WHERE la referencia al número de contrato o al de factura
... WHERE t.idcontrato = @idcontratoquesea AND f.nfactura = @numfacturaquesea

De este modo evitaras que reste el valor de factura que no se deba y al contrato que no se deba

Haz pruebas para ver si es lo que quieres...
lo intento de otra forma y no da, ya me estoy volviendo loco con esto, simplemenete lo que quiero es coger la tabla TOTAL CONTRATOS, que es donde queda el saldo de restar el VALOR DE LA FACTURA menos EL VALOR DEL CONTRATO.

y restarle EL VALOR DE EL SALDO QUE DEJO lo mencionado arriba la nueva factura con un nuevo valor es decir SALDO ANTERIOR - VALORNUEVAFACTURA

en un cuadro seria asi :

Cita:
n.contrato valor-contratro n.factura valor factura total
1 1.000 1 100 900
luego:

Cita:
n.contrato valor-contratro n.factura valor factura total
1 1.000 1 100 800
Porque ya no restaria de el valor de el contrato si no de el total que quedo de la primera resta
  #6 (permalink)  
Antiguo 04/02/2013, 15:00
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: update con un insert

A ver, lo que no entiendo es por qué necesitas almacenar un valor que puedes calcular. Dinos qué tablas tienes y los campos. Parece que hay dos tablas, pero precísanos los nombres de los campos y sus relaciones y un par de ejemplos con valores.
Si tú puedes hacer eso sin almacenarlo, por qué emplear recursos. No creo que sea necesaria siquiera la tabla totalcontratos. Imagino que tienes una tabla contratos o algo así relacionada con la tabla facturas por algún campo. Creo que es
Código MySQL:
Ver original
  1. SELECT (c.valorcontrato - SUM(f.valorfactura)) resto
  2.  FROM contratos c
  3.  INNER JOIN facturas f
  4. ON c.idcontrato = f.nfactura
  5.  GROUP BY c.idcontrato
  #7 (permalink)  
Antiguo 04/02/2013, 15:09
Avatar de andres_15_  
Fecha de Ingreso: septiembre-2008
Ubicación: Cali
Mensajes: 232
Antigüedad: 15 años, 7 meses
Puntos: 7
Respuesta: update con un insert

Cita:
Iniciado por jurena Ver Mensaje
A ver, lo que no entiendo es por qué necesitas almacenar un valor que puedes calcular. Dinos qué tablas tienes y los campos. Parece que hay dos tablas, pero precísanos los nombres de los campos y sus relaciones y un par de ejemplos con valores.
Si tú puedes hacer eso sin almacenarlo, por qué emplear recursos. No creo que sea necesaria siquiera la tabla totalcontratos. Imagino que tienes una tabla contratos o algo así relacionada con la tabla facturas por algún campo. Creo que es
Código MySQL:
Ver original
  1. SELECT (c.valorcontrato - SUM(f.valorfactura)) resto
  2.  FROM contratos c
  3.  INNER JOIN facturas f
  4. ON c.idcontrato = f.nfactura
  5.  GROUP BY c.idcontrato
bueno de antemano te agradezco la ayuda . la estructura que tengo es esta:

Tabla 1 (Facturas)

Código MySQL:
Ver original
  1. create table facturas(
  2. nfactura varchar(30) not null,
  3. valorfactura int(50) not null,
  4. ncontrato varchar(40) not null,
  5. primary key(nfactura)
  6. );

tabla 2 (Contratos)

Código MySQL:
Ver original
  1. CREATE TABLE `contratos` (
  2.   `idcontrato` varchar(20) NOT NULL,
  3.   `valorcontrato` mediumint(40) NOT NULL,
  4.   PRIMARY KEY (`idcontrato`)

Tabla 3 (Total contratos) //Aqui es donde guardo el resultado

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

y asi estoy haciendo para que en primera instancia me reste EL VALOR DEL CONTRATO - EL VALOR DE LA FACURA

Código MySQL:
Ver original
  1. insert into totalcontratos(idcontrato,
  2. valorcontrato,
  3. nfactura,
  4. valorfactura,
  5. total)
  6. select c.idcontrato,c.valorcontrato,f.nfactura,f.valorfactura,(c.valorcontrato-f.valorfactura)
  7. from contratos c inner join
  8. facturas f on c.idcontrato=f.ncontrato where f.nfactura=3;

Ahora lo que quiero es que en vez ce restarle de EL VALOR DE EL CONTRATO, me reste de EL VALOR DE EL SALDO QUE GUARDE EN EL TOTAL DE LA TABLA TOTALCONTRATOS
  #8 (permalink)  
Antiguo 04/02/2013, 15:15
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: update con un insert

Es que esa estructura no me parece correcta. Entiendo que un contrato puede relacionarse con 0, 1 o varias facturas. Si es así, deberías tener una tabla para contratos, otra para facturas, como las que tienes, y otra para facturascontrato; en esta última habría dos campos idcontrato e nfactura, que serán un índice compuesto único, y sus campos estarán relacionados con los idcontrato y nfactura de las otras tablas.
El total del contrato con la suma de las facturas restada será fácil de hacer y no tendrás que almacenar nada, sino obtenerlo mediante una consulta al vuelo.
  #9 (permalink)  
Antiguo 04/02/2013, 15:23
Avatar de andres_15_  
Fecha de Ingreso: septiembre-2008
Ubicación: Cali
Mensajes: 232
Antigüedad: 15 años, 7 meses
Puntos: 7
Respuesta: update con un insert

Cita:
Iniciado por jurena Ver Mensaje
Es que esa estructura no me parece correcta. Entiendo que un contrato puede relacionarse con 0, 1 o varias facturas. Si es así, deberías tener una tabla para contratos, otra para facturas y otra para facturascontrato; en esta última habría dos campos idcontrato e nfactura, que serán un índice compuesto único.
El total del contrato con la suma de las facturas restada será fácil de hacer y no tendrás que almacenar nada, sino obtenerlo mediante una consulta al vuelo.
jurena ya tengo las tablas FACTURAS y CONTRATOS como dices y FACTURASCONTRATOS es como si fuera la de TOTALCONTRATOS en esta ultima TOTALCONTRATOS coloque dos primarias que son codigo de el contrato y codigo de la factura, como puedes ver en lo que te coloque, y estas mismas a la vez son foraneas. El problema que tengo es que esto lo hago para llevar un registro de las facturas, es decir si el contrato esta por 5.000, la persona ira haciendo un pago y este le ira mermando al precio del contrato, por ejemplo 5.000-1.000=4.000, hasta ahi todo bien, lo que se me complica es que ya no debo RESTARLE al valor de el contrato, si no a esos 4.000 que fue en lo quedo la cuenta. por lo que la tabla donde almacene estos datos deberia quedar mas o menos asi:

5.000-1.000=4.000
4.000-1.000=3.000

deberia solo guardar el total e ir llevando el registro con el numero de factura y el valor de el pago hecho. no se si me explico, por favor si no me entiendes me dices. te agradezco tu colaboracion.
  #10 (permalink)  
Antiguo 04/02/2013, 16:01
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: update con un insert

Echa un vistazo a lo que yo te propongo. Mira el ejemplo.
Código MySQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `contratos` (
  2.   `idcontrato` varchar(20) NOT NULL,
  3.   `valorcontrato` mediumint(40) NOT NULL,
  4.   PRIMARY KEY (`idcontrato`)
  5.  
  6. INSERT INTO `contratos` (`idcontrato`, `valorcontrato`) VALUES
  7. ('C1', 25000);
  8.  
  9.  
  10. CREATE TABLE IF NOT EXISTS `facturas` (
  11.   `nfactura` varchar(30) NOT NULL,
  12.   `valorfactura` int(50) NOT NULL,
  13.   PRIMARY KEY (`nfactura`)
  14.  
  15. INSERT INTO `facturas` (`nfactura`, `valorfactura`) VALUES
  16. ('F1', 1000),
  17. ('F2', 5000);
  18.  
  19. CREATE TABLE IF NOT EXISTS `totalcontratos` (
  20.   `idcontrato` varchar(20) NOT NULL,
  21.   `nfactura` varchar(30) NOT NULL,
  22.   PRIMARY KEY (`idcontrato`,`nfactura`),
  23.   KEY `nfactura` (`nfactura`)
  24.  
  25. INSERT INTO `totalcontratos` (`idcontrato`, `nfactura`) VALUES
  26. ('C1', 'F1'),
  27. ('C1', 'F2');
  28.  
  29. ALTER TABLE `totalcontratos`
  30.   ADD CONSTRAINT `totalcontratos_ibfk_2` FOREIGN KEY (`idcontrato`) REFERENCES `contratos` (`idcontrato`),
  31.   ADD CONSTRAINT `totalcontratos_ibfk_1` FOREIGN KEY (`nfactura`) REFERENCES `facturas` (`nfactura`);

Y luego lanza esta consulta
Código MySQL:
Ver original
  1. valorcontrato - SUM( valorfactura )
  2. )resto
  3. FROM contratos c
  4. INNER JOIN totalcontratos tc ON c.idcontrato = tc.idcontrato
  5. INNER JOIN facturas f ON tc.nfactura = f.nfactura
  6. GROUP BY c.idcontrato
  #11 (permalink)  
Antiguo 04/02/2013, 16:17
Avatar de andres_15_  
Fecha de Ingreso: septiembre-2008
Ubicación: Cali
Mensajes: 232
Antigüedad: 15 años, 7 meses
Puntos: 7
Respuesta: update con un insert

Cita:
Iniciado por jurena Ver Mensaje
Echa un vistazo a lo que yo te propongo. Mira el ejemplo.
Código MySQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `contratos` (
  2.   `idcontrato` varchar(20) NOT NULL,
  3.   `valorcontrato` mediumint(40) NOT NULL,
  4.   PRIMARY KEY (`idcontrato`)
  5.  
  6. INSERT INTO `contratos` (`idcontrato`, `valorcontrato`) VALUES
  7. ('C1', 25000);
  8.  
  9.  
  10. CREATE TABLE IF NOT EXISTS `facturas` (
  11.   `nfactura` varchar(30) NOT NULL,
  12.   `valorfactura` int(50) NOT NULL,
  13.   PRIMARY KEY (`nfactura`)
  14.  
  15. INSERT INTO `facturas` (`nfactura`, `valorfactura`) VALUES
  16. ('F1', 1000),
  17. ('F2', 5000);
  18.  
  19. CREATE TABLE IF NOT EXISTS `totalcontratos` (
  20.   `idcontrato` varchar(20) NOT NULL,
  21.   `nfactura` varchar(30) NOT NULL,
  22.   PRIMARY KEY (`idcontrato`,`nfactura`),
  23.   KEY `nfactura` (`nfactura`)
  24.  
  25. INSERT INTO `totalcontratos` (`idcontrato`, `nfactura`) VALUES
  26. ('C1', 'F1'),
  27. ('C1', 'F2');
  28.  
  29. ALTER TABLE `totalcontratos`
  30.   ADD CONSTRAINT `totalcontratos_ibfk_2` FOREIGN KEY (`idcontrato`) REFERENCES `contratos` (`idcontrato`),
  31.   ADD CONSTRAINT `totalcontratos_ibfk_1` FOREIGN KEY (`nfactura`) REFERENCES `facturas` (`nfactura`);

Y luego lanza esta consulta
Código MySQL:
Ver original
  1. valorcontrato - SUM( valorfactura )
  2. )resto
  3. FROM contratos c
  4. INNER JOIN totalcontratos tc ON c.idcontrato = tc.idcontrato
  5. INNER JOIN facturas f ON tc.nfactura = f.nfactura
  6. GROUP BY c.idcontrato
Muchisimas gracias, la verdad me da un poco de pena contigo tanta preguntadera, hiciste mucho por ayudarme, me aclaraste mucho. Aunque todavia no me da el resultado como quiero que me lo arroge seguire buscando de como hacerlo, pero gracias a ti ya tengo una ayuda muy grande. Muchas gracias jurena

Etiquetas: insert, join, sql, tabla, update
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 15:07.