Как я могу проверить, существует ли таблица MySQL с PHP? - PullRequest
33 голосов
/ 22 июня 2011

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

Как я могу проверить, существует ли таблица 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");
}

Ответы [ 12 ]

68 голосов
/ 22 июня 2011
// 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 .

24 голосов
/ 22 июня 2011

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

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

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

13 голосов
/ 22 июня 2011
$res = mysql_query("SELECT table_name FROM information_schema.tables WHERE table_schema = '$databasename' AND table_name = '$tablename';");

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

11 голосов
/ 08 июля 2014

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

.000125 сек.(125 мкс)

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 мкс)

ПРЕДЕЛ 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
9 голосов
/ 22 июня 2011
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 голосов
/ 31 марта 2013

Даже быстрее, чем неправильный запрос:

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

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

4 голосов
/ 22 июня 2011

ПОКАЗАТЬ ТАБЛИЦЫ КАК 'TableName'

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

Чтобы использовать этот подход в PDO:

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

Чтобы использовать этот подход с УСТАРЕВЫМ mysql_query

$result      = mysql_query("SHOW TABLES LIKE 'tableName'");
$tableExists = mysql_num_rows($result) > 0;
3 голосов
/ 07 ноября 2013

Это уже было опубликовано, но здесь это с 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.

2 голосов
/ 22 июня 2011

НЕ ИСПОЛЬЗУЙТЕ 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.
0 голосов
/ 03 апреля 2019
<?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";
    } ?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...