Как просто в теории, как это звучит, я провел много исследований, и мне трудно понять это.
Как я могу проверить, существует ли таблица 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"); }
// 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 .
Самый простой способ добиться этого в PHP – просто использовать инструкцию DESCRIBE.
if(mysql_query("DESCRIBE `table`")) { // Exists }
Я не уверен, почему другие публикуют сложные запросы для такой прямой проблемы.
$res = mysql_query("SELECT table_name FROM information_schema.tables WHERE table_schema = '$databasename' AND table_name = '$tablename';");
Если записи не возвращаются, то их не существует.
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μs)
Значение 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
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();
потому что он устарел
Даже быстрее, чем плохой запрос:
SELECT count((1)) as `ct` FROM INFORMATION_SCHEMA.TABLES where table_schema ='yourdatabasename' and table_name='yourtablename';
Таким образом вы можете просто получить одно поле и одно значение. .016 секунд для моей более медленной системы.
Он уже был опубликован, но здесь он с 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.
SHOW TABLES LIKE 'TableName'
Если у вас есть ЛЮБЫЕ результаты, таблица существует.
Чтобы использовать этот подход в 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;
НЕ ИСПОЛЬЗУЙТЕ 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.
Или вы можете использовать
показать таблицы, где Tables_in_ {insert_db_name} = 'tablename';
Вы можете использовать множество различных запросов для проверки наличия таблицы. Ниже приведено сравнение между несколькими:
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
Эти контрольные показатели являются только средними: