MySQL - multiplicacion entre dos columnas y el total en una tercera

 
Vista:

multiplicacion entre dos columnas y el total en una tercera

Publicado por julian (3 intervenciones) el 20/06/2018 18:55:01
Qué tal buenas tardes!
Estoy intentando hacer una columna en mi base de datos mysql que el valor por defecto sea la multiplicacion entre otras dos columnas, es decir:
1
2
3
col1                  col2                       resultado
34                     10                         340
12                      5                            60

pero no me sale... intente de varias maneras y no puedo lograr que me salga. Lo último que probé fue esto:
1
2
3
SET @variable = (precioU * cantidad_total) FROM inventario;
 
ALTER TABLE `inventario`  ADD `valor_tota2l` DECIMAL(11) NOT NULL DEFAULT '@variable'  AFTER `precioU`;

Pero me tira el siguiente error:
1
2
3
4
5
6
7
consulta SQL:
 
 
SET @variable = (precioU * cantidad_total) FROM inventario
MySQL ha dicho: Documentación
 
#1064 - Algo está equivocado en su sintax cerca 'FROM inventario' en la linea 1
No logro deducir el problema... pido ayuda por favor, muchas gracias de antemano!
Saludos
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 953
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

multiplicacion entre dos columnas y el total en una tercera

Publicado por leonardo_josue (414 intervenciones) el 21/06/2018 17:00:48
Hola Julián:

Hay varias cosas a considerar con tu problema.

1. Si un campo puede ser calculado, no es recomendable que se almacene en la Base de Datos, ya que es completamente inútil ya que tendrías que programar triggers de inserción y de actualización para mantener la integridad del dato, ya que de lo contrario nada te impide que por código almacenes en ese campo algo distinto a la multiplicación y entonces tu información pasaría a ser simplemente un montón de basura.

2. En MySQL, lamentablemente no puedes asignar un valor por defecto como un campo calculado, tal como lo pretendes hacer, sino que tienen que ser valores "fijos". En este caso pasa lo mismo que en el punto 1, la forma para hacerlo es programando un TRIGGER BEFORE INSERT para que calcule el campo antes de asignar el valor, es decir, algo así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
mysql> CREATE TABLE tabla (campo1 INT, campo2 INT, campo3 INT);
Query OK, 0 rows affected (0.20 sec)
 
mysql> DROP TRIGGER IF EXISTS multiplica_campo;
Query OK, 0 rows affected (0.02 sec)
 
mysql> DELIMITER $$
mysql> CREATE
    ->     TRIGGER multiplica_campo BEFORE INSERT
    ->     ON tabla
    ->     FOR EACH ROW BEGIN
    ->        SET new.campo3 = new.campo1 * new.campo2;
    ->     END$$
Query OK, 0 rows affected (0.08 sec)
 
mysql> DELIMITER ;
mysql> INSERT INTO tabla values
    -> (34, 10, null),
    -> (12, 5, 60),
    -> (10, 10, 1);
Query OK, 3 rows affected (0.09 sec)
Records: 3  Duplicates: 0  Warnings: 0
 
mysql> SELECT * FROM tabla;
+--------+--------+--------+
| campo1 | campo2 | campo3 |
+--------+--------+--------+
|     34 |     10 |    340 |
|     12 |      5 |     60 |
|     10 |     10 |    100 |
+--------+--------+--------+
3 rows in set (0.00 sec)

En este caso, observa que en el primer INSERT no se le manda ningún valor al campo 3, en el segundo se envía el valor correcto y en el tercer caso se envía un valor erroneo, pero al final, el TRIGGER "cambia" este valor y le asigna el producto indicado.

Esto mismo tendrías que hacerlo al momento de un UPDATE, para evitar que alguien meta basura en el campo.

3. En cuanto al error, que comentas, este es porque tienes un error de sintaxis, revisa esta liga:

https://dev.mysql.com/doc/refman/5.7/en/set-variable.html

entonces, debes de poner un SELECT entre paréntesis para asignar el valor y este SELECT deber de regresar un ÚNICO valor:

1
2
3
4
5
6
7
8
9
10
mysql> SET @variable = (SELECT campo1 * campo2 FROM tabla LIMIT 1);
Query OK, 0 rows affected (0.00 sec)
 
mysql> SELECT @variable;
+-----------+
| @variable |
+-----------+
|       340 |
+-----------+
1 row in set (0.00 sec)

O si lo prefieres puedes usar la sintaxis SELECT - INTO:

1
2
3
4
5
6
7
8
9
10
mysql> SELECT campo1 * campo2 into @variable FROM tabla LIMIT 1, 1;
Query OK, 1 row affected (0.00 sec)
 
mysql> SELECT @variable;
+-----------+
| @variable |
+-----------+
|        60 |
+-----------+
1 row in set (0.00 sec)

De cualquier manera, como te comenté esto no de va a servir para asignarlo en el valor DEFAULT de la columna.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar

multiplicacion entre dos columnas y el total en una tercera

Publicado por Julian (3 intervenciones) el 21/06/2018 17:17:15
Muchas gracias Leo por tu tiempo y por tu ayuda! Voy a testearlo ya mismo... Muchas gracias! Aprovecho para consultar, es otro tema pero para no hacer un segundo post: soy nuevo en MySQL y estoy aprendiendolo a medida que lo voy usando. Ahora mi consulta es, hay manera que cada una cierta cantidad de tiempo una tabla reinicie o eliminé todos sus registros? Es decir, quiero que mi tabla de ventas diarias sea reiniciada todos los días a las 23:59. Hay manera?
Te agradezco mucho por la ayuda anterior, un saludo!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

multiplicacion entre dos columnas y el total en una tercera

Publicado por CSR STO (1 intervención) el 20/07/2019 03:23:18
Muchas Gracias por ese Gran Aporte !!! Funcionando a 100%
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar