MySQL - Limitar Stock

 
Vista:
sin imagen de perfil
Val: 1
Ha disminuido su posición en 60 puestos en MySQL (en relación al último mes)
Gráfica de MySQL

Limitar Stock

Publicado por Daniel (1 intervención) el 17/11/2018 16:59:20
Estoy haciendo un sistema de venta y tengo un problema.

Necesito que el campo de Stock no baje de 0 cuando se ingrese una compra con mas productos de los que hay en stock.
Leí que la constraint CHECK no funciona en MYSQL.

Cualquiera ayuda es bienvenida.
Gracias.

PD: No soy un usuario avanzado en MYSQL
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

Limitar Stock

Publicado por leonardo_josue (414 intervenciones) el 20/11/2018 15:34:07
Hola Daniel:

Creo que estás complicándote la vida. Si no quieres que un campo sea menor a cero, entonces basta con que lo definas como un campo UNSIGNED (es decir, sin signo), de esta manera, si intentas introducir un valor negativo a la consulta automáticamente MySQL te marcará un error:

Imagina que tienes esta tabla:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> CREATE TABLE tabla (id int, descripcion varchar(20), stock int unsigned, primary key (id));
Query OK, 0 rows affected (0.68 sec)
 
mysql> INSERT INTO tabla VALUES (1, 'producto uno', 1), (2, 'producto 2', 2);
Query OK, 2 rows affected (0.12 sec)
Records: 2  Duplicates: 0  Warnings: 0
 
mysql> SELECT * FROM tabla;
+----+--------------+-------+
| id | descripcion  | stock |
+----+--------------+-------+
|  1 | producto uno |     1 |
|  2 | producto dos |     2 |
+----+--------------+-------+
2 rows in set (0.23 sec)

entonces, si restamos 1 unidad a cada artículo, no queda algo así:

1
2
3
4
5
6
7
8
9
10
11
12
mysql> UPDATE tabla set stock = stock - 1;
Query OK, 2 rows affected (0.11 sec)
Rows matched: 2  Changed: 2  Warnings: 0
 
mysql> SELECT * FROM tabla;
+----+--------------+-------+
| id | descripcion  | stock |
+----+--------------+-------+
|  1 | producto uno |     0 |
|  2 | producto dos |     1 |
+----+--------------+-------+
2 rows in set (0.00 sec)

Observa que el articulo 1 ya no tiene stock, por lo tanto, si se intenta restar otra vez una unidad, aparece un error:

1
2
3
4
5
6
7
8
9
10
11
mysql> UPDATE tabla set stock = stock - 1;
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(`pruebas`.`tabla`.`stock` - 1)'
 
mysql> SELECT * FROM tabla;
+----+--------------+-------+
| id | descripcion  | stock |
+----+--------------+-------+
|  1 | producto uno |     0 |
|  2 | producto 2   |     1 |
+----+--------------+-------+
2 rows in set (0.00 sec)

Y lo mismo pasa si intentaras imputar un valor desde el insert menor a cero:

1
2
mysql> INSERT INTO tabla VALUES (3, 'producto tres', -1);
ERROR 1264 (22003): Out of range value for column 'stock' at row 1

Otra forma de validar esto sería con TRIGGERS (Disparadores) para validar antes del UPDATE y antes del INSERT que el valor del stock no sea negativo.

Haz la prueba y nos comentas.

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
0
Comentar