Ver Mensaje Individual
  #5 (permalink)  
Antiguo 11/08/2014, 06: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: 16 años, 5 meses
Puntos: 2658
Respuesta: consultas sql con sesiones en php

Cita:
*Toda la interfaz la he programado con espacios vacíos en vez de NULL y en las consultas e inserciones me salta bien los campos que no quiero rellenar. Puede ser que funciones las dos cosas? Porque a mí no me da ningún error y sí que obtengo resultados correctos en todo momento =S
No estás entendiendo lo que te digo...
Vamos a ver si se entiende: NULL en bases de datos no es un dato, es un estado de indefinición. No es lo mismo un caracter vacío (cadena de texto vacía) que un NULL, y cuando le insertar un caracter vacío no estás insertando NULL en la tabla. Por consecuencia un INSERT donde pongas uno de ellos sobre un campo definido como NOT NULL no disparará errores, pero si puede generar defectos en los datos obtenidos en las consultas.
Es decir:
Código MySQL:
Ver original
  1. INSERT tabla(b, c, d) VALUES('', '', '')
donde los campos estás definidos como NOT NULL te dejará hacer la inserción sin errores, pero luego, si llegases a hacer:
Código MySQL:
Ver original
  1. SELECT a, b, c, d
  2. FROM tabla
Esa consulta no devolverá ese registro porque ese campo no contiene un NULL. Contiene un caracter vacío, que no es lo mismo (ni siquiera como código ASCII).
Por otro lado, si alguna de esas columnas corresponde a una clave foránea, y no existe en la tabla referida una clave que contenga un caracter vacío, no serviría para hacer JOINs.

¿Qué corresponde hacer, entonces?
Simple: Si los campos aceptan NULL, ponerles NULL en el INSERT o UPDATE que corresponda, pero NO poner cadenas vacías:

Código MySQL:
Ver original
  1. INSERT tabla(b, c, d) VALUES(NULL, NULL, NULL)
nota que no estoy poniendo los NULL entre apostrofes, porque si lo hago no serían NULL sino cadenas de texto que digan "NULL".

Y si esas columnas no aceptan NULL, el INSERT que los tuviese dispararía un error por valor ilegal, lo que te permitiría asegurar que la información obligatoria ha sido efectivamente ingresada po rel usuairo donde debe, y no le permite dar altas de registros corruptos.

¿Se entiende?

Imaginate si el dato fuese el numero de tarjeta de crédito en un pago, y el tipo olvida ponerlo... ¿Cómo te aseguras que no se omita, o que no hayas omitido verificarlo en la validación correspondiente?
Datos mandatorios (obligatorios) deben siempre ser declarados NOT NUL en las tablas, y NO se debe usar cadenas vacías si el dato falta. Debes obligar al usuario a cumplir con los datos obligatorios.
Siempre.

Cita:
Quiero que en mi consulta, se inserte el dato de la ruta SOLAMENTE en aquellas tablas que contengan el nombre de empresa que hago en la búsqueda, por eso busqué información y en diversas páginas me aparece la cláusula WHERE. Soy bastante principiante en estos temas y estoy comenzando con php como quien dice, así que teniendo en cuenta que necesito una condición...me fié de lo encontrado.
¿ómo puedo hacer entonces para poner una condición?
Aquí pareces estar hablando de actualizar datos de un registro, y no insertar datos. En ese caso corresponde usar UPDATE, no INSERT.
INSERT crea registros nuevos no actualiza existentes. En ese contexto, no existen datos sobre los que hacer comparaciones, porque aún no se ha insertado el conjunto nuevo. Por eso INSERT no acepta WHERE.
Lo que sí puede suceder es que se esté insertando una PK duplicada, caso para el que existe una clausula especial (ON DUPLICATE KEY), que se usa para resolver el escenario.
Por otro lado, en MySQL existe una sentencia que posee una sintaxis especial y es REPLACE, la cual cumple ambas funciones (insertar/actualizar), peor debe ser usada con cuidado para no eliminar datos de los campos por accidente, o generar errores de restricciones si se afectan columnas que sean FK. Es de uso algo complejo de controlar.

En todo caso si lo que quieres es insertar si no existe otro que contenga un X valor, deberías hacer una consulta previa par verificar si ya existe, y en caso de no encontrarlo, entonces SI insertar el nuevo registro, o bien realizar el UPDATE correspondiente, si eso es lo que deseas.

¿Se entiende la idea?

Recuerda: NULL no es un dato. Es un estado donde no está definido ningún valor .
__________________
¿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; 11/08/2014 a las 07:30