MySQL - Campo que no admita negativos

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

Campo que no admita negativos

Publicado por Diego (10 intervenciones) el 15/08/2018 00:35:19
Buenas tardes.
Quisiera saber si existe alguna manera de restringir un campo para que no admita negativos. Pero directamente en la base, sin verificar antes que sea mayor a 0.

El tema es el siguiente, yo envío una consulta que resta 1 a un campo de tipo INT determinado, pero quiero que si el contenido es 0 no ejecute la consulta, pero el tipo de campo INT admite negativos.

El problema que tengo, para que les quede mas claro.... Es un sistema de reservas hoteleras. El usuario selecciona el rango de fechas y el sistema devuelve las habitaciones que hay disponibles en ese lapso. Luego selecciona la habitacion, luego la forma de pago y luego completa sus datos. Al procesar la reserva lo primero que se hace es restar la disponibilidad del tipo de habitacion seleccionada en las fechas indicadas. Y el problema radica en que en el lapso de tiempo entre que carga las fechas y termina el proceso hay uno o dos minutos dependiendo de la velocidad con la que ingrese sus datos, y esto puede ocasionar que si dos personas coinciden en el tipo de habitación y mientras uno está cargando sus datos el otro pide disponibilidad en fechas que se "pisen", el primero tendrá la reserva confirmada y el que ingresó luego podría generar una sobreventa.

Yo ya lo solucioné en la versión anterior volviendo a chequear la dispo justo antes de generar la reserva, pero la idea es optimizar el proceso y que no haga dos veces lo mismo.

Como no soy un experto en MySQL quería saber si existe la opción de indicarle a la base que un campo no admite valores por debajo de cero y que si tiene que realizar una consulta que genere esto directamente no lo procese o devuelva un error.

Muchas gracias !
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
Imágen de perfil de xve
Val: 796
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Campo que no admita negativos

Publicado por xve (1151 intervenciones) el 15/08/2018 08:08:39
Hola Diego, segun entiendo, lo podrias poner dentro del while el condicional de que el valor sea superior a 0, no? algo así:

1
UPDATE Tabla SET disponibilidad=disponibilidad-1 WHERE disponibilidad>0

Te sirve?
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
sin imagen de perfil
Val: 953
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Campo que no admita negativos

Publicado por Leonardo Josué (414 intervenciones) el 16/08/2018 15:30:19
Hola Diego:

La manera más simple que tienes es simplemente poner tu campo DISPONIBILIDAD como un campo SIN SIGNO... de tal manera que acepte sólo valores positivos:

1
2
3
4
5
6
7
8
9
10
11
12
13
mysql> CREATE TABLE tabla (campo_sin_signo int unsigned, campo_con_signo int);
Query OK, 0 rows affected (0.29 sec)
 
mysql> insert into tabla values (1, -1);
Query OK, 1 row affected (0.09 sec)
 
mysql> SELECT * FROM tabla;
+-----------------+-----------------+
| campo_sin_signo | campo_con_signo |
+-----------------+-----------------+
|               1 |              -1 |
+-----------------+-----------------+
1 row in set (0.00 sec)

De esta manera, cuando hagas la inserción, si intentas meter un número negativo en el campo SIN SIGNO, el mismo DBMS te regresará un error, el cual puedes manejar ya de acuerdo a tus necesidades:

1
2
mysql> insert into tabla values (-1, -1);
ERROR 1264 (22003): Out of range value for column 'campo_sin_signo' at row 1

https://dev.mysql.com/doc/refman/8.0/en/numeric-type-overview.html

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
sin imagen de perfil
Val: 10
Ha aumentado su posición en 3 puestos en MySQL (en relación al último mes)
Gráfica de MySQL

Campo que no admita negativos

Publicado por Diego (10 intervenciones) el 16/08/2018 16:02:08
Buen día Leo.
Muchas gracias, es exactamente lo que tengo que hacer. Había pensado en esa solución, pero ni siquiera la había probado porque vaya uno a saber por qué, estaba convencido que si a un campo UNSIGNED de valor 0 le restabas 1 daba como resultado 1. Es decir que lo transformaba a positivo y no retornaba un error.
Recién lo probé y funcionó.
Me retorna otro error (#1690), pero igual funciona. Ahora voy a investigar sobre estos errores a ver si aprendo algo más.

Muchas gracias por tu aporte.

Solucionado !
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
sin imagen de perfil
Val: 10
Ha aumentado su posición en 3 puestos en MySQL (en relación al último mes)
Gráfica de MySQL

Campo que no admita negativos

Publicado por Diego (10 intervenciones) el 16/08/2018 15:50:56
Hola xve.
Lo probé, pero el problema es que no me devuleve un error. Te explico mejor como es el proceso.
Yo genero una consulta en una tabla (tbl_dispo) que tiene la siguiente estructura.

id - INT AUTONUMERICO
fecha - DATE
h1 - INT
h2 - INT
h3 - INT
h4 - INT
h5 - INT

Y otros campos que no vienen al caso.
Cada campo, h1, h2, h3... es un tipo de habitación y cada uno tiene cargado un valor correspondiente a la disponibilidad de ese tipo de habitacion en esa fecha.
La consulta lo que hace es que al generar una reserva resta en 1 la disponibilidad de un tipo de habitacion.
Por ejemplo:

UPDATE tbl_dispo SET h2=h2 - 1 WHERE id>=5 and id<8

Esto lo hago llamando un procedimiento almacenado, pero la consulta podría ser esta. Lo que le digo es que me reste 1 al campo h2 entre dos determinados id (5, 6 y 7).

Probé tu solución pero lo que hace es restar 1 al campo h2 mientras sea >0, pero el problema es que si es 0 lo deja así e igualmente resta en el resto de los dias, y la idea es que si hay un campo h2=0 no haga nada y de alguna manera me retorne un error o algo.

Como dije anteriormente esto yo ya lo solucioné volviendo a chequear la dispo justo antes de generar la reserva, pero la idea es no repetir un proceso que ya hice, y como es una evolución del sistema anterior la idea es optimizarlo, Desde ya que los tiempos son imperceptibles y el trafico del sitio es mínimo, pero si se puede optimizar mejor, y obviamente evitar un overbooking que es lo peor que le puede pasar a un hotel.

Saludos !
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