La princesa Ruruna y Cain tienen un problema: su imperio de venta de fruta es un enredo de datos conflictivos y duplicados y la organización de los melones, manzanas y fresas les causan serios problemas. ¿Pero que pueden hacer ellos?

design-database
Con la ayuda de Tico, una hada mágica, Ruruna y Cain aprenden como crear y gestionar una base de datos que conseguirá poner un poco de orden en el reino frutero de Kod.

tico

Un poco de historia

La empresa MySQL AB (originalmente TCX DataKonsultAB) nace en 1995, en Suecia, fundada por David Axmark, Allan Larsson, y Michael "Monty" Widenius. Monty llevaba varios años desarrollando un sistema había que ofrecía una forma optimizada y flexible para acceder a bases de datos SQL utilizando el método ISAM, ya que ninguna de las interfaces existentes le resultaba adecuada, así surgió una nueva API de acceso a SQL que podía y puede ser accedida y modificada por terceras partes, esta api se llamó MySQL.

El prefijo My tiene dos posibles orígenes, uno es corporativo, ya que llevaban tiempo llamando a todas sus aplicaciones con este prefijo, o también familiar, ya que el primer hijo de Monty se llama My.
Personalmente, yo me quedo con esta segunda explicación, ya que el segundo hijo de Monty, Max, da nombre al interfaz de datos para SAP MaxDB y la tercera hija se llama María, y da nombre al nuevo motor relacional de MySQL que substuirá a InnoDB.

El origen del delfín que MySQL usa como logo

MySQL sufrió un rediseño drástico en 2001, y uno de los puntos clave del cambio fue el logo, un delfín que representa la simbología de una especie en peligro y fue diseñado por el finlandés Renne Angelvuo (lo cierto es que apenas he encontrado información del diseñador y no estoy seguro de que sea la misma persona).

La pseudocolumna ROWNUM sirve, en Oracle, fundamentalmente para dos cosas:

  • Numerar por órden de visualización los registros recuperados por una consulta.
  • Limitar el número de registros devueltos por una consulta

Para realizar lo segundo en MySQL, la cláusula LIMIT es mucho más simple y efectiva que el método para limitar con ROWNUM en Oracle, sin embargo lo primero, es decir, mostrar un contador de registros en MySQL no tiene un equivalente directo, aún así, se puede emular de la siguiente forma:

Pongamos la siguiente consulta, que devuelve los registros de una tabla de ejemplo:

mysql> SELECT * FROM frutas;
+-----------+----------+
| nombre    | color    |
+-----------+----------+
| fresa     | rojo     |
| platano   | amarillo |
| manzana   | verde    |
| uva       | verde    |
| pera      | verde    |
| mandarina | naranja  |
| melocoton | marron   |
| limon     | amarillo |
+-----------+----------+
8 rows in set (0,00 sec)

Utilizando variables podemos conseguir mostrar el número de fila en MySQL:

SELECT @rownum:=@rownum+1 AS rownum, frutas.*
FROM (SELECT @rownum:=0) r, frutas;

mysql> SELECT @rownum:=@rownum+1 AS rownum, frutas.*
    -> FROM (SELECT @rownum:=0) r, frutas;
+--------+-----------+----------+
| rownum | nombre    | color    |
+--------+-----------+----------+
|      1 | fresa     | rojo     |
|      2 | platano   | amarillo |
|      3 | manzana   | verde    |
|      4 | uva       | verde    |
|      5 | pera      | verde    |
|      6 | mandarina | naranja  |
|      7 | melocoton | marron   |
|      8 | limon     | amarillo |
+--------+-----------+----------+
8 rows in set (0,00 sec)

Desgraciadamente no es posible usar variables dentro del código de las vistas, por lo que si intentamos crear una vista con el código anterior, nos devolverá un error:

mysql> CREATE VIEW vw_frutas AS SELECT @rownum:=@rownum+1 AS rownum, frutas.*
    ->  FROM (SELECT @rownum:=0) r, frutas;
ERROR 1351 (HY000): View's SELECT contains a variable or parameter

Gracias a Albert por la idea del post ;-)

El jueves pasado terminé la formación que estuve impartiendo durante esos meses sobre Oracle SQL y Pl/Sql en la academia Cedesca.

Al ser un curso subvencionado, supuso al mismo tiempo una ventaja y un reto, la ventaja reside en la facilidad con la que los alumnos trabajan en un entorno más relajado, ya que no están pagando directamente el curso, el reto comparte la causa de origen, ya que es mucho más complicado mantener el ritmo necesario para terminar de impartir los objetivos fijados en el comienzo.

Los sectores de los que provenían los alumnos eran muy diversos, aunque en su mayoría eran del ramo informático, aunque había varios con ganas de reconvertirse profesionalmente, esto produce una disparidad de niveles y experiencias que enriquece la experiencia global, aunque está claro que cuanto más sabes de una materia, más vas a aprender cuando te formen.
Aún así, hasta los que menos idea inicial tenían, al final del curso fueron capaces de instalar y utilizar una base de datos en su casa (tengo pendiente publicar el screencast que grabé en clase cuando hice la demo de instalación).

lo + positivo

  • Hubo muy buen rollo en clase, durante todo el curso el ambiente fue relajado y casi todo el mundo participó activamente
  • Me ha permitido poder generar una documentación que está bastante bien, tengo pendiente pulirla y juntarla toda para liberar un ebook.
  • Empezaron el curso 16 personas y le pude entregar el título (funciona por asistencia) a 13 de ellas, las otras 3 directamente ni aparecieron o no volvieron tras comprobar el horario (¿o el profe?) el primer día.
  • Pude echarle un vistazo a las valoraciones finales (anónimas) que los alumnos le dieron al curso, y la verdad que fueron excelentes, máxima puntuación exceptuando una o dos excepciones.
  • El aspecto económico no es algo que se deba dejar de mencionar ;-).

no tan positivo

  • Durante el mes y medio que ha durado el curso, mi tiempo libre ha estado demasiado cercano a 0, entre preparar los materiales y las cuatro horas de clase, dos días por semana, no me han dejado tiempo para mucho más. Además de compaginarlo con el trabajo en Neurotic, claro.
  • Debo mejorar un poco la disciplina horaria de los alumnos, empezando a las seis de la tarde, hasta las seis y media no he podido empezar las clases la mayoría de los días. Aunque siendo un curso de seis a diez de la noche, después de salir de trabajar, creo que ellos bastante hacían con aparecer por allí.
  • Tuve que hacer un sprint final los últimos cuatro días, me hubiera gustado dedicarle un poco más de tiempo a un par de temas.

En resumidas cuentas, si me surge la oportunidad de nuevo, no dudaré en continuar dando formaciones esporádicas de Oracle o MySQL, he disfrutado mucho en el proceso, pero ahora me vendrá bien un descanso durante un tiempo...

Publicaré dentro de poco la documentación que he generado para el curso, quién esté ansioso por tenerla antes, no tiene más que pedirmela!

En MySQL, cuando intentamos realizar una carga de datos sobre una instancia ya existente, existe la posibilidad de obtener un error parecido a este:

ERROR 1153 (08S01) at line 625: Got a packet bigger than 'max_allowed_packet' bytes

Esto pasa porque el cliente desde que estamos cargando los datos envía un paquete mayor de lo que el servidor está configurado para soportar, la instalación por defecto configura esta variable de sistema a 1Mb.
Es necesario que tanto el cliente de mysql como el servidor (mysqld) estén configurados para aceptar paquetes de datos mayores.

Configurar el servidor

Debemos modificar el fichero de configuración de MySQL, en el caso de sistemas Windows, el fichero my.ini de la carpeta donde hayamos instalado el servidor. Para sistemas *nix, el fichero /etc/my.cnf.
En ambos casos deberemos añadir/modificar el parámetro max_allowed_packet que se encuentra en la sección [mysqld], por ejemplo, para ponerlo a 16M

max_allowed_packet=16M

Y después reiniciar el servidor MySQL.

Configurar el cliente

La configuración del cliente puede no ser necesaria, pero se puede abrir una sesión indicando el valor para el parámetro max_allowed_packet, por ejemplo:

mysql --max_allowed_packet=16M

A partir de la versión 4 de MySQL, este parámetro puede ser de hasta 1 Gb.
Más información de la configuración de este parámetro en la documentación oficial.

Durante estos meses estoy dando un curso titulado: Introducción a Oracle SQL y PL/SQL en Cedesca, una academia de formación situada en el centro de Barcelona.
Es un curso subvencionado por Fomento para trabajadores en activo, y son un total de 60 horas repartidas en 15 sesiones, dos días por semana, a cuatro horas por sesión, lo que hace que el curso dure unos dos meses.

Hacía algún tiempo que no daba clases y no voy a negar que me ha cogido algo desentrenado, pero con unas sesiones tan intensivas, he cogido el ritmo bastante rápido por no hablar de que el temario me ha ayudado bastante, ya que el lenguaje SQL, especialmente el de Oracle, es algo que tengo muy por la mano.

El presupuesto para la documentación de los alumnos, al ser un curso subvencionado, era muy cercano a 0, por lo que, en lugar de entregarles un libro muy básico o que no se ajuste al objetivo del curso, he optado por realizar yo la documentación, algo que me está ocupando gran parte de mi tiempo libre, pero que tiene un propósito múltiple:

  • Disponer de un material propio, con el que me siento cómodo y que puedo modificar libremente.
  • Reutilizar la documentación para futuros cursos.
  • Liberar el manual para que lo use / modifique todo aquel al que le sea de ayuda.

Estoy intentando orientar el curso de forma muy práctica, dedicando más del 50% del tiempo a realizar y revisar ejercicios y casos prácticos, todavía me falta terminar la parte final de la documentación y juntarlo todo en un único fichero, pero he adjuntado un par de temas en este post para que si queréis, le echéis un vistazo y me digáis que os parece, si puedo mejorar algo, consejos sobre la licencia con que publicar esto...

Hay veces que realizamos operaciones de inserción que involucran valores autonuméricos y necesitamos averiguar el idetificador del último registro que hemos añadido para utilizarlo en verificaciones, o incluso en otras operaciones con la base de datos, como insertar registros hijos.

La función a utilizar en este caso sería last_insert_id(), a continuación muestro un ejemplo de su funcionamiento

He establecido un entorno de pruebas muy sencillo con un pequeño esquema que representa un sistema de autobuses y sus viajeros.