Php mysql проверить существует ли таблица

Как проверить, существует ли таблица 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

ОТВЕТЫ

Ответ 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 мкс)

Читайте также:  Java email validation pattern

Значение 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  

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

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  

Ответ 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

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

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

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

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

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_ = '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

"; $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"; >?> 

Источник

Проверка на существование таблицы

Проверка записи на существование в БД
Перед добавлением новой записи в БД, осуществляю проверку на ее существавание в БД. Например при.

Проверка на существование логина в БД
Хочу при регистрации проверить, есть ли пользователь с таким логином. $sql = mysql_query("SELECT *.

Запрос и проверка на существование
Доброго времени суток. Есть 5 переменных ($a, $b, $c, $d, $e) которые методом $_GET берут.

SHOW TABLES LIKE 'the-table';

Добавлено через 18 минут
или просто

if (!mysql_query("SELECT * FROM table_name")){ echo "Таблицы нет"; }

Эксперт HTML/CSSЭксперт PHP

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
 $link = mysql_connect('sql-4.radyx.ru', 'connections611','sdap3b6ii1') or die(mysql_error()); mysql_select_db('connections611') or die(mysql_error()); /*--------Готовим текст для записи----------- --------------------------------------------*/ $n=iconv('UTF-8', 'windows-1251',$_POST['n']); $name=iconv('UTF-8', 'windows-1251',$_POST['name']); $text=iconv('UTF-8', 'windows-1251',$_POST['text']); strip_tags($n); strip_tags($name); strip_tags($text, "
"
); if (empty($text)) exit; if (empty($name)==true) $name="Аноним"; $text=str_replace("\n",'
'
,$text); /*--------Работаем с базой данных----------- --------------------------------------------*/ if (!mysql_query("SELECT * FROM `".$n."`")){ $req='CREATE TABLE `'.$n.'` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY , `name` TINYTEXT NOT NULL , `text` LONGTEXT NOT NULL ) ENGINE = MYISAM CHARACTER SET cp1251 COLLATE cp1251_bin;'; } mysql_query("INSERT INTO `".$n."` SET `name`='".$name."', `text`='".$text."'"); mysql_close($link) ?>

Эксперт HTML/CSSЭксперт PHP

CREATE TABLE IF NOT EXISTS `table_name` ( . 

Добавлено через 54 секунды
и mysql_query() не поддерживает нескольких запросов. и вы неверно составляете запрос. они должны быть по очереди, а не один в одном.

Добавлено через 1 минуту
кто вам сказал что ошибок нет?

mysql_query(. ) or die(mysql_error());

ЦитатаСообщение от NoBodyIsPerfect Посмотреть сообщение

if (!mysql_query("SELECT * FROM table_name")){ * * * * echo "Таблицы нет"; * * }

а если таблица 500 мегабайт? Не будет ли это излишним при каждом выполнении скрпита выбирать все данные из таблицы?)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
 $link = mysql_connect('sql-4.radyx.ru', 'connections611','sdap3b6ii1') or die(mysql_error()); mysql_select_db('connections611') or die(mysql_error()); /*--------Готовим текст для записи----------- --------------------------------------------*/ $n=iconv('UTF-8', 'windows-1251',$_POST['n']); $name=iconv('UTF-8', 'windows-1251',$_POST['name']); $text=iconv('UTF-8', 'windows-1251',$_POST['text']); strip_tags($n); strip_tags($name); strip_tags($text, "
"
); if (empty($text)) exit; if (empty($name)==true) $name="Аноним"; $text=str_replace("\n",'
'
,$text); /*--------Работаем с базой данных----------- --------------------------------------------*/ $req="CREATE TABLE IF NOT EXISTS `".$n."` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY , `name` TINYTEXT NOT NULL , `text` LONGTEXT NOT NULL ) ENGINE = MYISAM CHARACTER SET cp1251 COLLATE cp1251_bin;"; mysql_query($req); mysql_query("INSERT INTO `".$n."` SET `name`='".$name."', `text`='".$text."'"); mysql_close($link) ?>

ЦитатаСообщение от KOPOJI Посмотреть сообщение

ЦитатаСообщение от DrobyshevAlex Посмотреть сообщение

а если таблица 500 мегабайт? Не будет ли это излишним при каждом выполнении скрпита выбирать все данные из таблицы?)

Эксперт HTML/CSSЭксперт PHP

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

mysql_query($req) or die(mysql_error()." ".mysql_errno());

Эксперт HTML/CSSЭксперт PHP

mysql_query($req) or die(mysql_error());
$req="CREATE TABLE IF NOT EXISTS `".$n."` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, `name` TINYTEXT NOT NULL , `text` LONGTEXT NOT NULL, PRIMARY KEY (`id`) ) ENGINE = MYISAM CHARACTER SET cp1251 COLLATE cp1251_bin;";

ЦитатаСообщение от KOPOJI Посмотреть сообщение

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

вообще это пишу как обучающий проект,поэтому особого значения это не имеет пока что)
да и возиться с кодировкой опять лениво)

`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,

вы про эту строчку?
она правильная( стащено с другого проекта,там все равботает)

Добавлено через 1 минуту
хм..нет,не создает

Эксперт HTML/CSSЭксперт PHP

да в том то и дело что все вроде правильно.. mysql_error() молчит?

Добавлено через 2 минуты

echo mysql_query($req) ? 'Succesfully' : 'Error: '.mysql_error();
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
 $link = mysql_connect('sql-4.radyx.ru', 'connections611','sdap3b6ii1') or die(mysql_error()); mysql_select_db('connections611') or die(mysql_error()); /*--------Готовим текст для записи----------- --------------------------------------------*/ $n=iconv('UTF-8', 'windows-1251',$_POST['n']); $name=iconv('UTF-8', 'windows-1251',$_POST['name']); $text=iconv('UTF-8', 'windows-1251',$_POST['text']); strip_tags($n); strip_tags($name); strip_tags($text, "
"
); if (empty($text)) exit; if (empty($name)==true) $name="Аноним"; $text=str_replace("\n",'
'
,$text); /*--------Работаем с базой данных----------- --------------------------------------------*/ $req="CREATE TABLE IF NOT EXISTS `".$n."` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY , `name` TINYTEXT NOT NULL , `text` LONGTEXT NOT NULL , PRIMARY KEY (`id`) ) ENGINE = MYISAM CHARACTER SET cp1251 COLLATE cp1251_bin;"; //mysql_query($req); echo mysql_query($req) ? 'Succesfully' : 'Error: '.mysql_error(); mysql_query("INSERT INTO `".$n."` SET `name`='".$name."', `text`='".$text."'"); mysql_close($link) ?>

ЦитатаСообщение от spydark91 Посмотреть сообщение

`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY

Источник

Оцените статью