Назад | Перейти на главную страницу

Как из сценария оболочки проверить, существует ли таблица в базе данных MySQL?

Я пытаюсь написать сценарий, который позволяет пользователю выбирать, какие манипуляции ему нужно делать на столе. Я хочу проверить, существует ли таблица. Если он существует, я продолжу другие дела, иначе я выйду, сказав, что таблица не существует. Как я могу этого добиться.

if [ $(mysql -N -s -u root -p -e \
    "select count(*) from information_schema.tables where \
        table_schema='db_name' and table_name='table_name';") -eq 1 ]; then
    do something
else
    echo "table <table_name> does not exist"
    exit 1
fi
  • -N пропустить имена столбцов
  • -s для нетабулярного вывода

В MySQL вы можете использовать -e из оболочки

mysql -e "desc main_db.clients" > /dev/null 2>&1
echo $?

Если вам нужен метод, который не включает запуск клиента mysql и вход на сервер mysql, вы можете сделать это:

if ls -l /var/lib/mysql/database/table.frm 2> /dev/null > /dev/null
then
  echo Table exists
else
  echo Table does not exist
fi

Вам нужно будет заменить путь к вашему каталогу данных, имя вашей базы данных и имя вашей таблицы в первой строке.

Предостережения:

  1. Это не сработает, если вы используете InnoDB и не используя innodb-file-per-table. т.е. сценарий может сказать, что таблица не существует, даже если она существует.
  2. Этот файл может существовать по разным причинам, включая копирование таблиц с использованием файловой системы или переключение с MyISAM на InnoDB. т.е. сценарий может сказать, что таблица существует, хотя ее нет.

Это не так надежно, как другие методы, представленные уже по причинам, указанным выше, но он позволяет избежать клиента mysql, поэтому он все еще может быть полезным.

Обратите внимание, что все методы, представленные здесь, зависят от правильности получения вами собственных разрешений (файловой системы или MySQL). Если вы ошиблись, скорее всего, вы получите ложноотрицательный результат.