Как проверить, существует ли таблица MySQL с PHP?

Как просто в теории, как это звучит, я провел немало исследований, и мне трудно понять это.

Как проверить, существует ли таблица MySQL и что она делает что-то. (Думаю, для этого может работать простой оператор php if/else)

Есть ли способ сделать это?

Это то, что я сделал с ответом cwallenpoole:

mysql_connect("SERVER","USERNAME","PASSWORD");
mysql_select_db('DATABASE');

$val = mysql_query('select 1 from `TABLE`');

if($val !== FALSE)
{
   print("Exists");
}else{
   print("Doesn't exist");
}

Ответ 1

// Select 1 from table_name will return false if the table does not exist.
$val = mysql_query('select 1 from `table_name` LIMIT 1');

if($val !== FALSE)
{
   //DO SOMETHING! IT EXISTS!
}
else
{
    //I can't find it...
}

По общему признанию, это больше Pythonic, чем PHP-идиома, но, с другой стороны, вам не нужно беспокоиться о большом количестве дополнительных данных.

Изменить

Итак, этот ответ был отмечен как минимум дважды с момента, когда я пишу это сообщение. Предполагая, что я совершил некоторую гигантскую ошибку, я пошел, и я провел некоторые тесты, и именно это я обнаружил, что мое решение на 10% быстрее чем ближайшая альтернатива, когда таблица не существует, и она на 25% быстрее, когда таблица существует:

:::::::::::::::::::::::::BEGINNING NON-EXISTING TABLE::::::::::::::::::::::::::::::
23.35501408577 for bad select
25.408507823944 for select from schema num rows -- calls mysql_num_rows on select... from information_schema.
25.336688995361 for select from schema fetch row -- calls mysql_fetch_row on select... from information_schema result
50.669058799744 for SHOW TABLES FROM test
:::::::::::::::::::::::::BEGINNING EXISTING TABLE::::::::::::::::::::::::::::::
15.293519973755 for good select
20.784908056259 for select from schema num rows
21.038464069366 for select from schema fetch row
50.400309085846 for SHOW TABLES FROM test

Я попытался запустить это против DESC, но у меня был тайм-аут после 276 секунд (24 секунды для моего ответа, 276, чтобы не завершить описание не существующей таблицы).

Для хорошей оценки я сравниваю схему с четырьмя таблицами, и это почти новая установка MySQL (пока это единственная база данных). Чтобы увидеть экспорт, посмотрите здесь.

И ДАЛЕЕ

Это конкретное решение также более независимо от базы данных, поскольку тот же запрос будет работать в PgSQL и Oracle.

НАКОНЕЦ

mysql_query() возвращает FALSE для ошибок, которые не являются "эта таблица не существует".

Если вам нужно гарантировать, что таблица не существует, используйте mysql_errno(), чтобы получить код ошибки и сравнить ее с соответствующим Ошибки MySQL.

Ответ 2

Самый простой способ добиться этого в PHP - просто использовать инструкцию DESCRIBE.

if(mysql_query("DESCRIBE `table`")) {
    // Exists
}

Я не уверен, почему другие отправляют сложные запросы для такой прямой проблемы.

Ответ 3

$res = mysql_query("SELECT table_name FROM information_schema.tables WHERE table_schema = '$databasename' AND table_name = '$tablename';");

Если записи не возвращаются, то их не существует.

Ответ 4

125 микросекунд таблица существует проверка

.000125 сек. (125μs)

mysql_unbuffered_query("SET profiling = 1");  // for profiling only

@mysql_unbuffered_query("SELECT 1 FROM `table` LIMIT 1 ");
if (mysql_errno() == 1146){

 // NO EXISTING TABLE CODE GOES HERE

}
elseif(mysql_errno() > 0){

  echo mysql_error();    

}

$results = mysql_query("SHOW PROFILE");  // for profiling only

Время выполнения, измеренное с использованием профилирования mysql, когда таблица существует или нет, составляет около .000125 сек. (125 мкс)

Значение LIMIT 1 важно для скорости. Это минимизирует время запроса сортировки и отправки данных. И размер таблицы не является фактором.

Я всегда использую небуферизованный запрос, когда результаты не требуются.

РЕЗУЛЬТАТЫ ПРОФИЛЯ КОГДА ТАБЛИЦА НЕ СУЩЕСТВУЕТ

QUERY STATE           SECONDS   
--------------------  -------
starting              0.000025  
checking permissions  0.000006  
Opening tables        0.000065  
query end             0.000005  
closing tables        0.000003  
freeing items         0.000013  
logging slow query    0.000003  
cleaning up           0.000003  
TOTAL                 0.000123  <<<<<<<<<<<< 123 microseconds

КОГДА ТАБЛИЦА СУЩЕСТВУЕТ

QUERY STATE           SECONDS   
--------------------  -------
starting              0.000024
checking permissions  0.000005
Opening tables        0.000013
System lock           0.000007
init                  0.000006
optimizing            0.000003
statistics            0.000009
preparing             0.000008
executing             0.000003
Sending data          0.000019
end                   0.000004
query end             0.000004
closing tables        0.000006
freeing items         0.00001
logging slow query    0.000003
cleaning up           0.000003
TOTAL                 0.000127 <<<<<<<<<<<< 127 microseconds

Ответ 5

mysql_query("SHOW TABLES FROM yourDB");
//> loop thru results and see if it exists
//> in this way with only one query one can check easly more table 

или mysql_query("SHOW TABLES LIKE 'tblname'");

Не используйте mysql_list_tables();, потому что он устарел

Ответ 6

Даже быстрее, чем плохой запрос:

SELECT count((1)) as `ct`  FROM INFORMATION_SCHEMA.TABLES where table_schema ='yourdatabasename' and table_name='yourtablename';

Таким образом вы можете просто получить одно поле и одно значение..016 секунд для моей более медленной системы.

Ответ 7

ПОКАЗАТЬ ТАБЛИЦЫ, КАК "Имя таблицы"

Если у вас есть ЛЮБЫЕ результаты, таблица существует.

Использовать этот подход в PDO:

$pdo         = new \PDO(/*...*/);
$result      = $pdo->query("SHOW TABLES LIKE 'tableName'");
$tableExists = $result !== false && $result->rowCount() > 0;

Использовать этот подход с DEPRECATED mysql_query

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

Ответ 8

Он уже был отправлен, но здесь он с PDO (тот же запрос)...

$connection = new PDO ( "mysql:host=host_db; dbname=name_db", user_db, pass_db );

if ($connection->query ("DESCRIBE table_name"  )) {
    echo "exist";
} else {
    echo "doesn't exist";
}

Работает как очарование для меня....

И вот другой подход (я думаю, что он медленнее)...

if ($connection->query ( "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE table_schema = 'db_name' AND table_name ='tbl_name'" )->fetch ()) {
    echo "exist";
} else {
    echo "doesn't exist";
}

Вы также можете играть с этим запросом:

SHOW TABLE STATUS FROM db_name LIKE 'tbl_name'

Я думаю, что это было предложено использовать на странице mysql.

Ответ 9

НЕ ИСПОЛЬЗУЙТЕ MYSQL ЛЮБОЕ БОЛЬШЕ. Если вы должны использовать mysqli, но PDO лучше всего:

$pdo = new PDO($dsn, $username, $pdo); // proper PDO init string here
if ($pdo->query("SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE table_schema = 'db_name'")->fetch()) // table exists.

Ответ 10

Или вы можете использовать

показать таблицы, где Tables_in_ {insert_db_name} = 'tablename';

Ответ 11

Вы можете использовать множество различных запросов, чтобы проверить, существует ли таблица. Ниже приведено сравнение между несколькими:

mysql_query('select 1 from `table_name` group by 1'); or  
mysql_query('select count(*) from `table_name`');

mysql_query("DESCRIBE `table_name`");  
70000   rows: 24ms  
1000000 rows: 24ms  
5000000 rows: 24ms

mysql_query('select 1 from `table_name`');  
70000   rows: 19ms  
1000000 rows: 23ms  
5000000 rows: 29ms

mysql_query('select 1 from `table_name` group by 1'); or  
mysql_query('select count(*) from `table_name`');  
70000   rows: 18ms  
1000000 rows: 18ms  
5000000 rows: 18ms  

Эти контрольные показатели являются только средними:

Ответ 12

<?php 
$connection = mysqli_connect("localhost","root","","php_sample_login_register"); 

if ($connection){
        echo "DB is Connected <br>";
        $sql = "CREATE TABLE user(
            id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
            name VARCHAR(255)NOT NULL,
            email VARCHAR(255)NOT NULL,
            password VARCHAR(255) NOT NULL
            );";
        if(mysqli_query($connection,$sql)) {
            echo "Created user table";
        } else{
            echo "User table already exists";
        }
    } else {
        echo "error : DB isnot connected";
    } ?>