MySQL перевірити, чи існує таблиця без викидання винятку


123

Який найкращий спосіб перевірити, чи існує таблиця в MySQL (бажано через PDO в PHP), не кидаючи винятку. Мені не подобається аналізувати результати "SHOW TABLES LIKE" et cetera. Повинен бути якийсь булевий запит?

Відповіді:


199

Я не знаю синтаксис PDO для цього, але це здається досить прямим:

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

дякую, повністю забув, що
ПОКАЗУВАННЯ ТАБЛИЦІВ

53
PDO: $ tableExists = $ db-> query ("SHOW TABLES LIKE 'myTable" ") -> rowCount ()> 0;
Реакційний

4
mysqli: if ($ db-> query ("SHOW TABLES LIKE '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/


можливо, мені чогось не вистачає, але чому б ти використовував цей метод над показними таблицями?
nickf

1
@nickf Це частина стандарту ansi, тому він портативний між різними rdbms'es.
troelskn

@nickf: Він також працює на базах даних, крім MySQL. Наскільки я можу сказати, це включає PostgreSQL і SQL Server.
Powerlord

цікаво, чи це подвиг безпеки, ви можете запитувати інформацію з баз даних, до яких ви не підключені ...
Talvi Watia

3
Немає ризику для безпеки - запити до бази даних__chema показуватимуть лише таблиці, до яких підключений користувач має права.
Воррен Румак

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, тому переконайтеся, що ваш $tablevar чистий або навіть краще використовувати параметризовані запити.


Тільки якщо ви дозволите комусь заповнити var $ table var, не кожен var всередині sql-позиції небезпечний, лише якщо ви отримуєте дані з недовірених джерел. Звичайно, ви відповідаєте за те, як ви використовуєте цю функцію та здійснюєте фільтрацію. не потрібно спростовувати цю відповідь.
Falk

Якщо ви опублікуєте такий код, хтось в кінцевому підсумку використовуватиме його в місці, де дані не були перевірені належним чином, і в результаті буде ін'єкція SQL. Просто використовуйте параметризовані запити, і ви уникнете будь-яких проблем, незалежно від того, дані перевірені чи ні. Тут немає жодних причин не робити цього, це лише погана практика.
jcaron

Як щодо додавання real_escape_string?
Falk

Використовуйте параметризовані запити та уникайте страшилок.
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")
   ){

З цим я просто підштовхую іншу умову до або. А для моїх потреб мені просто просто потрібно померти. Хоча ви можете налаштувати або на інші речі. Деякі можуть віддати перевагу if / else if / else. Що потім видалити або подати, якщо / else якщо / 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".
Езотерика

-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

Якщо причиною цього хочеться створити умовну таблицю, то "СТВОРИТИ ТАБЛИЦЮ, ЩО НЕ існує" ідеально підходить для роботи. Поки я не виявив цього, я застосував вищезгаданий метод '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.