Ver Mensaje Individual
  #4 (permalink)  
Antiguo 14/06/2014, 16:44
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: ¿Qué estoy haciendo mal? [Procedimiento almacenado]

Cita:
#1048 - Column 'id' cannot be null
Eso se puede dar en el contexto de ese SP si y sólo si la tabla está vacía. Cuando ya existe al menos un registro eso no se puede dar, si se usa:

Código SQL:
Ver original
  1. SELECT MAX(id) FROM Usuarios INTO numusuario;

Para resolverlo no hay que haer lo que hiciste, porque se genera una duplicidad de datos. Lo que corresponde es verificar si la variable se volvió nula...

Código MySQL:
Ver original
  1. CREATE PROCEDURE CrearUsuario (
  2.     IN idx CHAR(9),
  3.     IN nombrex VARCHAR(25),
  4.     IN apellidox VARCHAR(25),
  5.     IN edadx INT(2),
  6.     IN generox CHAR(1),
  7.     IN ciudadx VARCHAR(30),
  8.     IN estadox VARCHAR(30),
  9.     IN paisx VARCHAR(30))
  10.     DECLARE numUsuario INT DEFAULT 0;
  11.     IF (SELECT count(1) FROM Usuarios WHERE id = idx) = 0 THEN
  12.         SELECT MAX(id) FROM Usuarios INTO numusuario;
  13.         -- Controlando que sea nulo, y por tanto la tabla este vacia.
  14.         SET numUsuario = IFNULL(numUsuario, 0) + 1;
  15.         INSERT INTO Usuarios(id, nombre, apellido, edad, genero, ciudad, estado, pais)
  16.         VALUES(numUsuario, nombrex, apellidox, edadx, generox, ciudadx, estadox, paisx);
  17.     ELSE
  18.         UPDATE Usuarios
  19.           SET nombre = nombrex,
  20.           apellido = apellidox,
  21.           edad = edadx,
  22.           genero = generox,
  23.           ciudad = ciudadx,
  24.           estado = estadox,
  25.           pais = paisx
  26.         WHERE id = idx;
  27.     END IF;
  28.     SELECT numUsuario;
  29. END$$

Para que se entienda: NULL no es un valor, es un estado. Pero toda operación de suma, multiplicación, división, resta, o concatenación de cualquier valor con NULL, da... NULL.
Entre esas situaciones está que MAX(), MIN(), AVG(), aplicado sobre una tabla sin registros, o una consulta que no devuelve registros, da pro resultado NULL.
Además, el hecho de que inicialices una variable con un valor por default, no implica que el valor se conserve si (como en este caso), le terminas asignando un resutlado NULL. En ese caso prevalece el NULL, y por eso se rompe todo.
La solución es sencilla: Debes controlar toda posibilidad de que se presente el NULL y no hacer operaciones con valores así.

Nota final: Como NULL no es un dato, tampoco se pueden usar operadores lógicos con el, sólo se puede verificar si es o no nulo. Por eso en ciertas ocasiones puede ser conveniente usar IF EXISTS, IS NULL o IS NOT NULL, para validar el resultado de consultas y subconsultas.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 14/06/2014 a las 16:50