Comprobar si una tabla existe

Para comprobar si existe una tabla podemos hacer algo parecido a lo que hemos hecho con la base de datos. Intentaremos hacer una consulta sobre la tabla, y si fracasamos, verificaremos si el error es ER_NO_SUCH_TABLE. En tal caso, la tabla no existe.

Crearemos otra función C++ para esta tarea:

bool ExisteTabla(MYSQL *myData, char *db, char *tabla)
\{
   char *consulta;
   char *plantilla = "SELECT * FROM %s.%s";
   bool valorret = true;
   
   consulta = new char[strlen(db)+strlen(tabla)+strlen(plantilla)-1];
   sprintf(consulta, plantilla, db, tabla);
   if(mysql_query(myData, consulta)) \{
      if(ER_NO_SUCH_TABLE == mysql_errno(myData)) valorret = false;
   }
   delete[] consulta;
   return valorret;
}

Otra opción, mucho más recomendable, es hacer una consulta usando la sentencia SHOW TABLES, de un modo análogo al usado con las bases de datos:

bool ExisteTabla(MYSQL *myData, char *db, char *tabla)
\{
   char *consulta;
   char *plantilla = "SHOW TABLES FROM %s LIKE \'%s\'";
   MYSQL_RES *res;
   bool valorret = true;
   
   consulta = new char[strlen(db)+strlen(tabla)+strlen(plantilla)-1];
   sprintf(consulta, plantilla, db, tabla);

   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;
}

Crear una tabla

Para crear una tabla usaremos la sentencia CREATE TABLE. El proceso se explica con detalle en el capítulo 7 del curso de MySQL.

Para crear las tablas que necesitamos para esta base de datos usaremos las siguientes consultas SQL:

mysql> CREATE TABLE agenda.nombres (
    -> id INT NOT NULL AUTO_INCREMENT, 
    -> nombre VARCHAR(40), 
    -> PRIMARY KEY (id)) 
    -> ENGINE=InnoDB;
Query OK, 0 rows affected (0.61 sec)

mysql> CREATE TABLE agenda.telefonos (
    -> id INT NOT NULL,
    -> tipo VARCHAR(20),
    -> numero VARCHAR(15),
    -> FOREIGN KEY (id) REFERENCES nombres(id)
    -> ON DELETE CASCADE
    -> ON UPDATE CASCADE)
    -> ENGINE=InnoDB;
Query OK, 0 rows affected (0.14 sec)

mysql>

En nuestro programa C++ crearemos las tablas que no existan usando este código:

   if(!ExisteTabla(myData, "agenda", "nombres")) \{
      cout << "La tabla \"Nombres\" no existe." << endl;
      cout << "La creamos..." << endl;
      mysql_query(myData, "CREATE TABLE agenda.nombres ("
         "id INT NOT NULL AUTO_INCREMENT, "
         ";nombre VARCHAR(40), "
         ";PRIMARY KEY (id)) "
         "ENGINE=InnoDB");
   }

   if(!ExisteTabla(myData, "agenda", "telefonos")) \{
      cout << "La tabla \"Telefonos\" no existe." << endl;
      cout << "La creamos..." << endl;
      mysql_query(myData, "CREATE TABLE agenda.telefonos ("
         "id INT NOT NULL, "
         "tipo VARCHAR(20), "
         "numero VARCHAR(15), "
         "FOREIGN KEY (id) REFERENCES nombres(id) "
         "ON DELETE CASCADE "
         "ON UPDATE CASCADE) "
         "ENGINE=InnoDB");
   }

Eliminar una tabla

Análogamente podemos eliminar tablas usando consultas con la sentencia DROP TABLE:

   cout << "Eliminar tabla de nombres" << endl;
   mysql_query(myData, "DROP TABLE agenda.nombres");

Eliminar una base de datos

Lo mismo sirve para eliminar bases de datos, usando la sentencia DROP DATABASE:

   cout << "Eliminar base de datos" << endl;
   mysql_query(myData, "DROP DATABASE agenda");