3 Crear una base de datos

Hemos empezado por lo más simple: leer datos desde una base de datos existente. En este capítulo veremos cómo crear y eliminar bases de datos y tablas.

En este capítulo y el siguiente crearemos una aplicación de ejemplo para gestionar una base de datos simple de contactos, con sólo nombres y números de teléfono.

La base de datos se llamará "agenda", y para poder empezar a trabajar con ella necesitaremos un usuario con acceso a esa base de datos y con todos los privilegios. De modo que empezaremos por abrir una sesión MySQL y conceder al usuario "curso" todos los privilegios sobre la tabla "agenda". Recondermos que esto se puede hacer aunque tal base de datos no exista:

mysql> GRANT ALL ON agenda.* TO curso;
Query OK, 0 rows affected (0.08 sec)

La base de datos "agenda" contendrá dos tablas, una con los nombres de los contactos, y una segunda con los números de teléfono. Ambas tablas estarán interrelacionadas por una clave de indentificación de usuario:

Diagrama de Agenda

La estructura de la tabla de nombres es:

  • id: clave identificadora. Usaremos un entero autoincrementado.
  • nombre: nombre de contacto. Usaremos una cadena de longitud variable de 40 caracteres.

En cuanto a la tabla de teléfonos, la estructura es:

  • id: clave identificadora de contacto. Clave foránea de la tabla de nombres. Crearemos una referencia de modo que las modificaciones de clave se transmitan en cascada y los borrados también.
  • tipo: tipo de teléfono. Indicará si es un celular, fijo, particular, etc. Usaremos una cadena de longitud variable de 20 caracteres.
  • numero: número de teléfono. Usaremos una cadena de longitud variable de 15 caracteres.

Por supuesto, usaremos tablas InnoDB.

Averiguar si existe una base de datos

Antes de empezar a trabajar con una base de datos puede ser interesante saber si tal base de datos existe o no. Esto nos permitirá crear la base de datos si es la primera vez que se ejecuta la aplicación o si se ha eliminado la base de datos desde la última ejecución.

Para averiguar si una base de datos existe intentaremos activarla, y si se produce un error, verificaremos si ese error es debido a que la base de datos no existe. Para ello comprobaremos si el valor de error es ER_BAD_DB_ERROR. Vamos a crear una función C++ para esta tarea:

bool ExisteDB(MYSQL *myData, char *db)
\{
   // Conectar a base de datos.
   if(mysql_select_db(myData, db)) \{
      if(ER_BAD_DB_ERROR == mysql_errno(myData)) return false;
   }
   return true;
}

Otra alternativa, quizás mucho mejor, es verificar si existe la base de datos usando una sentencia SHOW DATABASES. Si mostramos sólo las bases de datos cuyo nombre coincida con el de la que deseamos verificar, bastará con comprobar el número de filas retornadas. Si ese número es cero significa que la base de datos no existe:

bool ExisteDB(MYSQL *myData, char *db)
\{
   char *consulta;
   char *plantilla = "SHOW DATABASES LIKE \'%s\'";
   MYSQL_RES *res;
   bool valorret = true;

   consulta = new char[strlen(db)+strlen(plantilla)];
   sprintf(consulta, plantilla, db);

   if(!mysql_query(myData, consulta)) \{
      if((res = mysql_store_result(myData))) \{
         // Procesar resultados
         if(!mysql_num_rows(res)) valorret = false;
         // Liberar el resultado de la consulta:
         mysql_free_result(res);
      }
   }
   delete[] consulta;
   return valorret;
}

Hemos tenido que hacer uso de memoria dinámica para preparar la cadena para hacer la consulta. Esto será muy habitual, sobre todo cuando las consultas se compliquen, y requieran selecciones y proyecciones (seleccionar columnas y filas). Más adelante crearemos una función para hacer este proceso más sencillo.

Crear una base de datos

A pesar de que existe una función en el API C de MySQL para crear bases de datos, mysql_create_db, su uso está desaconsejado, y es preferible usar mysql_query para lanzar una consulta CREATE DATABASE.

   if(!ExisteDB(myData, "agenda")) \{
      cout << "La base de datos \"agenda\" no existe." << endl;
      cout << "La creamos..." << endl;
      mysql_query(myData, "CREATE DATABASE agenda");
   }

Esto creará la base de datos "agenda" si no existe previamente, pero no creará ninguna tabla.