MySQL проверяет, существует ли таблица, не вызывая исключения


123

Каков наилучший способ проверить, существует ли таблица в MySQL (предпочтительно через PDO в PHP), не вызывая исключения. Мне не хочется разбирать результаты "ПОКАЗАТЬ ТАБЛИЦЫ КАК" и так далее. Должен быть какой-то логический запрос?

Ответы:


199

Я не знаю синтаксиса PDO для него, но это кажется довольно простым:

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

спасибо, совершенно забыл , что SHOW TABLES LIKE может быть ограничен только один точный таблицы
clops

53
PDO: $ tableExists = $ db-> query («ПОКАЗАТЬ ТАБЛИЦЫ, КАК 'myTable'») -> rowCount ()> 0;
Reactgular

4
mysqli: if ($ db-> query ("ПОКАЗАТЬ ТАБЛИЦЫ, КАК 'myTable'") -> num_rows == 0) {// создать таблицу}
zPuls3

1
@MathewFoscarini, rowCount () в этом случае может быть ненадежным, см . Документ PHP .
datasn.io

4
Там нет больше нет поддержки для mysql_*функций, они официально осуждается , больше не поддерживается и будет удален в будущем. Вы должны обновить свой код с помощью PDO или MySQLi, чтобы обеспечить функциональность вашего проекта в будущем.
TRiG

39

Если вы используете MySQL 5.0 и новее, вы можете попробовать:

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

Любые результаты указывают на то, что таблица существует.

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


возможно, мне что-то не хватает, но зачем использовать этот метод вместо SHOW TABLES?
nickf 06

1
@nickf Это часть стандарта ansi, поэтому его можно переносить между разными rdbms.
troelskn

@nickf: он также работает с базами данных, отличными от MySQL. Насколько я могу судить, это включает PostgreSQL и SQL Server.
Powerlord 06

интересно, является ли это уязвимостью безопасности, вы можете запрашивать информацию из баз данных, к которым вы не подключены ...
Талви Ватия

3
Риск безопасности отсутствует - запросы к базе данных information_schema будут отображать только те таблицы, к которым подключенный пользователь имеет права.
Уоррен Румак,

8

Используя mysqli, я создал следующую функцию. Предположим, у вас есть экземпляр mysqli с именем $ 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);
}

Надеюсь, поможет.

Предупреждение: как предположил @jcaron, эта функция может быть уязвима для sqlinjection attacs, поэтому убедитесь, что ваш $tablevar чистый, или даже лучше используйте параметризованные запросы.


Только если вы позволите кому-то заполнить переменную $ table, не каждая переменная внутри sql statment опасна, только если вы получаете данные из ненадежных источников. Конечно, вы несете ответственность за использование функции и фильтрацию. нет необходимости голосовать против этого ответа.
Фальк,

Если вы опубликуете такой код, кто-то в конечном итоге будет использовать его в месте, где данные не были должным образом проверены, и в итоге получит SQL-инъекцию. Просто используйте параметризованные запросы, и вы избежите любых проблем, независимо от того, были ли данные проверены или нет. Здесь нет никаких причин не делать этого, это просто плохая практика.
jcaron

Как насчет добавления real_escape_string?
Фальк

Используйте параметризованные запросы и избегайте страшных историй.
jcaron

4

Это просто публикуется, если кто-то ищет этот вопрос. Хотя на него немного ответили. Некоторые ответы делают его более сложным, чем хотелось бы.

Для mysql * я использовал:

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

В PDO я использовал:

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

Здесь я просто вставляю условие else в или. А для моих нужд мне просто нужно умереть. Хотя можно установить или на другие вещи. Некоторые могут предпочесть if / else if / else. Который затем удалить или, а затем поставить if / else if / else.


3

Вот мое решение, которое я предпочитаю при использовании хранимых процедур. Пользовательская функция mysql для проверки наличия таблицы в текущей базе данных.

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

Поскольку "Показать таблицы" может работать медленно в больших базах данных, я рекомендую использовать "DESCRIBE" и проверить, получаете ли вы в результате true / false.

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

Из того, что я прочитал, если «SHOW» становится неэффективным, то «information_schema» более предпочтительнее, чем «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
Пожалуйста, добавьте точный комментарий к коду, чтобы обеспечить наилучшее качество ответа. Простая вставка кода мало что говорит автору вопроса.
Якуб Матчак

5
Это на самом деле ужасно. Итак, если имеется 50 000 таблиц, вы должны загрузить все таблицы, просмотреть каждую из них, чтобы определить, существует ли правильная таблица?
Рохит Чопра

-1

Zend framework

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;

    }

-1

Если причиной этого является условное создание таблицы, то «CREATE TABLE IF NOT EXISTS» кажется идеальным вариантом для этой работы. Пока я этого не обнаружил, я использовал метод DESCRIBE, описанный выше. Подробнее здесь: MySQL «СОЗДАТЬ ТАБЛИЦУ, ЕСЛИ НЕ СУЩЕСТВУЕТ» -> Ошибка 1050


-9

Почему вам так сложно понять?

function table_exist($table){ 
    $pTableExist = mysql_query("show tables like '".$table."'");
    if ($rTableExist = mysql_fetch_array($pTableExist)) {
        return "Yes";
    }else{
        return "No";
    }
} 
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.