MySQL verifica si existe una tabla sin lanzar una excepción


123

¿Cuál es la mejor manera de verificar si existe una tabla en MySQL (preferiblemente a través de PDO en PHP) sin lanzar una excepción? No tengo ganas de analizar los resultados de "SHOW TABLES LIKE", etc. Debe haber algún tipo de consulta booleana?

Respuestas:


199

No conozco la sintaxis de PDO para esto, pero esto parece bastante sencillo:

$result = mysql_query("SHOW TABLES LIKE 'myTable'");
$tableExists = mysql_num_rows($result) > 0;

gracias, olvidé por completo que SHOW TABLES LIKE podría limitarse a una sola tabla exacta
clops

53
PDO: $ tableExists = $ db-> query ("MOSTRAR TABLAS COMO 'myTable'") -> rowCount ()> 0;
Reactgular

44
mysqli: if ($ db-> query ("MOSTRAR TABLAS COMO 'myTable'") -> num_rows == 0) {// crear tabla}
zPuls3

1
@MathewFoscarini, rowCount () puede no ser confiable en este caso, consulte el documento de PHP .
datasn.io

44
No hay más soporte para mysql_*funciones, están oficialmente en desuso , ya no se mantienen y se eliminarán en el futuro. Debe actualizar su código con PDO o MySQLi para garantizar la funcionalidad de su proyecto en el futuro.
TRiG

39

Si está utilizando MySQL 5.0 y versiones posteriores, puede intentar:

SELECT COUNT(*)
FROM information_schema.tables 
WHERE table_schema = '[database name]' 
AND table_name = '[table name]';

Cualquier resultado indica que la tabla existe.

De: http://www.electrictoolbox.com/check-if-mysql-table-exists/


tal vez me falta algo, pero ¿por qué usarías este método sobre SHOW TABLES?
nickf

1
@nickf Es parte del estándar ansi, por lo que es portátil entre diferentes rdbms'es.
troelskn

@nickf: también funciona en bases de datos distintas de MySQL. Esto incluye PostgreSQL y SQL Server por lo que puedo decir.
Powerlord

preguntándose si esto es una vulnerabilidad de seguridad, puede consultar información de bases de datos a las que no está conectado ...
Talvi Watia

3
No hay riesgo de seguridad: las consultas a la base de datos information_schema solo mostrarán las tablas a las que el usuario conectado tiene privilegios.
Warren Rumak

8

Usando mysqli he creado la siguiente función. Asumiendo que tiene una instancia de mysqli llamada $ con.

function table_exist($table){
    global $con;
    $table = $con->real_escape_string($table);
    $sql = "show tables like '".$table."'";
    $res = $con->query($sql);
    return ($res->num_rows > 0);
}

Espero eso ayude.

Advertencia: como lo sugiere @jcaron, esta función podría ser vulnerable a los ataques de sqlinjection, así que asegúrese de que su $tablevar esté limpia o incluso mejor use consultas parametrizadas.


Solo si deja que alguien complete la tabla $ var, no todas las variables dentro de una declaración sql son peligrosas, solo si obtiene los datos de fuentes no confiables. Por supuesto, usted es responsable de cómo utiliza la función y realiza el filtrado. no hay necesidad de rechazar esta respuesta.
Falk

Si publica un código como este, alguien terminará usándolo en un lugar donde los datos no se han verificado correctamente y terminará con una inyección de SQL. Simplemente use solicitudes parametrizadas y evitará cualquier problema, ya sea que los datos hayan sido verificados o no. No hay ninguna razón para no hacerlo aquí, es solo una mala práctica.
jcaron

¿Qué hay de agregar una cadena_escape_real?
Falk

Use consultas parametrizadas y evite las historias de terror.
jcaron

4

Esto se publica simplemente si alguien viene a buscar esta pregunta. A pesar de que ha sido respondido un poco. Algunas de las respuestas lo hacen más complejo de lo necesario.

Para mysql * utilicé:

if (mysqli_num_rows(
    mysqli_query(
                    $con,"SHOW TABLES LIKE '" . $table . "'")
                ) > 0
        or die ("No table set")
    ){

En PDO utilicé:

if ($con->query(
                   "SHOW TABLES LIKE '" . $table . "'"
               )->rowCount() > 0
        or die("No table set")
   ){

Con esto solo empujo la condición else a o. Y para mis necesidades solo necesito morir. Aunque puede configurar o para otras cosas. Algunos pueden preferir el if / else if / else. Cuál es entonces eliminar o y luego suministrar if / else if / else.


3

Aquí está la solución que prefiero cuando uso procedimientos almacenados. La función mysql personalizada para verificar la tabla existe en la base de datos actual.

delimiter $$

CREATE FUNCTION TABLE_EXISTS(_table_name VARCHAR(45))
RETURNS BOOLEAN
DETERMINISTIC READS SQL DATA
BEGIN
    DECLARE _exists  TINYINT(1) DEFAULT 0;

    SELECT COUNT(*) INTO _exists
    FROM information_schema.tables 
    WHERE table_schema =  DATABASE()
    AND table_name =  _table_name;

    RETURN _exists;

END$$

SELECT TABLE_EXISTS('you_table_name') as _exists

2

Como "Mostrar tablas" puede ser lento en bases de datos más grandes, le recomiendo usar "DESCRIBIR" y verificar si obtiene verdadero / falso como resultado

$tableExists = mysqli_query("DESCRIBE `myTable`");

Por lo que leí si 'SHOW' se vuelve ineficiente, entonces 'information_schema' es más preferido que 'DESCRIBE'.
Esoterica

-1
$q = "SHOW TABLES";
$res = mysql_query($q, $con);
if ($res)
while ( $row = mysql_fetch_array($res, MYSQL_ASSOC) )
{
    foreach( $row as $key => $value )
    {
        if ( $value = BTABLE )  // BTABLE IS A DEFINED NAME OF TABLE
            echo "exist";
        else
            echo "not exist";
    }
}

2
Agregue un comentario preciso para el código para proporcionar la mejor calidad de respuesta. Simplemente pegue algo de código no le dice mucho al autor de la pregunta.
Jakub Matczak

55
Esto es realmente horrible. Entonces, si hay 50,000 tablas, cargaría todas las tablas, recorrería cada una para encontrar si existe la tabla correcta.
Rohit Chopra

-1

Marco Zend

public function verifyTablesExists($tablesName)
    {
        $db = $this->getDefaultAdapter();
        $config_db = $db->getConfig();

        $sql = "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = '{$config_db['dbname']}'  AND table_name = '{$tablesName}'";

        $result = $db->fetchRow($sql);
        return $result;

    }


-9

¿Por qué lo haces tan difícil de entender?

function table_exist($table){ 
    $pTableExist = mysql_query("show tables like '".$table."'");
    if ($rTableExist = mysql_fetch_array($pTableExist)) {
        return "Yes";
    }else{
        return "No";
    }
} 
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.