Mostrando entradas con la etiqueta sql. Mostrar todas las entradas
Mostrando entradas con la etiqueta sql. Mostrar todas las entradas

lunes, 1 de julio de 2013

¿SQL en la URL?

¿A que suena un poco feo? ¿No es una burrada tener una URL en la que, aparentemente, va la consulta?

Pues el DFP SB (de Google), funciona con estas URLs. Curioso.

viernes, 13 de abril de 2012

(n+1)*n/2

La suma de los N primeros números naturales es
S = (N+1)*N/2

Utilidad aplicada:

Supongamos un modelo de datos (una tabla) en el que hay un atributo para ordenar, un entero correlativo que empieza en 0. Para garantizar la coherencia de los datos, tenemos que asegurarnos que cada operación de modificación deja la tabla bien:

Aquí tenemos un ejemplo de datos coherentes:
+--------+-------+
| _order | id    |
+--------+-------+
|      0 | 18685 |
|      1 | 21971 |
|      2 | 21979 |
|      3 | 21977 |
|      4 | 21975 |
|      5 | 21973 |
|      6 | 22047 |
+--------+-------+


Y aquí uno de datos no coherentes: se ha borrado un dato pero no se ha actualizado bien el _order en la tabla:

+--------+-------+
| _order | id    |
+--------+-------+
|      0 | 18685 |
|      1 | 21971 |
|      2 | 21979 |
|      3 | 21977 |
|      4 | 21975 |
|      6 | 21973 |
|      7 | 22047 |
+--------+-------+


¿Cómo comprobar en una tabla estas incoherencias? Aquí entra en juego nuestra fórmula.

Si todo está bien, la suma de los _order + 1 debe ser igual a la suma de los n enteros hasta los N registros que tengamos en la tabla.



SELECT COUNT(id), 
cliente,
SUM(_order+1) AS suma_order,
ROUND((COUNT(id)+1)*COUNT(id)/2, 0) AS suma_buena
FROM tabla
GROUP BY cliente
HAVING ROUND((COUNT(id)+1)*COUNT(id)/2, 0) != SUM(_order+1)
ORDER BY COUNT(id);

miércoles, 12 de enero de 2011

Fallos tontos con INSERT en SQL

El otro día tuve que arreglar un "bug" que yo mismo había causado. En un momento dado, se guardaba un valor en una tabla de N campos. Mi "query" era la siguiente:
INSERT INTO miTabla VALUES ('valor1', 'valor2', 'valor3');

En un momento dato, se hizo necesario añadir un campo más a esta tabla. Inocente de mí, pensé lo siguiente: "si añado el campo con un valor por defecto, no se estropeará ninguna "query", ya que, aunque la consulta no mencione el campo, éste ya tiene un valor por defecto".
Craso error.
La "query" anterior fallaba (estoy utilizando MySQL), ya que se encontraba con un campo más de lo esperado.
Conclusión: hay que escribir explícitamente todos los campos en los INSERT. Nunca se sabe qué cambiará.
INSERT INTO miTabla (campo1, campo2, campo3) VALUES ('valor1', 'valor2', 'valor3');