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:
La estructura de la tabla de nombres es:
En cuanto a la tabla de teléfonos, la estructura es:
Por supuesto, usaremos tablas InnoDB.
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.
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.
© Mayo de 2005, Salvador Pozo Coronado, salvador@conclase.net