【问题标题】:How to check if a table exists in a MySQL database using shell script?如何使用 shell 脚本检查 MySQL 数据库中是否存在表?
【发布时间】:2017-12-08 10:13:31
【问题描述】:

我正在尝试使用 shell 脚本检查表是否为空 我的代码是

#!/bin/bash

if [ "mysql -u user -ppassword -hserver dbname -e 'select count(*) from test_dec;'" != 0 ];
then
        echo "table not empty"
else
        echo "table empty"
fi

但是当我运行它时,即使查询的输出为 0,它也总是显示“table not empty”。

user@server$ ./table_check.sh
table not empty

这里有什么问题?

【问题讨论】:

    标签: mysql shell


    【解决方案1】:

    这是我的脚本版本,它会首先检查表是否存在,如果存在则检查表是否为空。

    重击

    #!/bin/bash
    
    # Prepare variables
    TABLE=$1
    SQL_EXISTS=$(printf 'SHOW TABLES LIKE "%s"' "$TABLE")
    SQL_IS_EMPTY=$(printf 'SELECT 1 FROM %s LIMIT 1' "$TABLE")
    
    # Credentials
    USERNAME=YOUR_USERNAME    
    PASSWORD=YOUR_PASSWORD
    DATABASE=YOUR_DATABASE_NAME
    
    echo "Checking if table <$TABLE> exists ..."
    
    # Check if table exists
    if [[ $(mysql -u $USERNAME -p$PASSWORD -e "$SQL_EXISTS" $DATABASE) ]]
    then
        echo "Table exists ..."
    
        # Check if table has records    
        if [[ $(mysql -u $USERNAME -p$PASSWORD -e "$SQL_IS_EMPTY" $DATABASE) ]]
        then
            echo "Table has records ..."
        else
            echo "Table is empty ..."
        fi
    else
        echo "Table not exists ..."
    fi
    

    用法

    首先,在使用此脚本之前,您需要将 YOUR_USERNAMEYOUR_PASSWORDYOUR_DATABASE_NAME 替换为相应的值。那么:

    # bash SCRIPT_NAME TABLE_TO_CHECK
      bash my_script my_table
    

    其中 SCRIPT_NAME( my_script ) 是包含上述脚本内容的文件的名称,TABLE_TO_CHECK( my_table ) 是您要检查的表的名称。

    预期输出

    Checking if table <my_table> exists ...  
    Table exists ...   
    Table is empty ... 
    

    关于代码的几句话

    将命令行的第一个参数存储在变量TABLE

    TABLE=$1
    

    准备两个变量来保存用于检查的 SQL 查询。 注意printf是用来在变量中插入表名的,因为$('SHOW TABLES LIKE "$TABLE"')是不行的。

    SQL_EXISTS=$(printf 'SHOW TABLES LIKE "%s"' "$TABLE")
    SQL_IS_EMPTY=$(printf 'SELECT COUNT(*) as records FROM %s' "$TABLE")
    

    检查表是否存在。如果表不存在,SHOW TABLES LIKE "table_name" 将返回空字符串,if statement 将失败。像$(echo 1 + 2) 一样使用$ 意味着 - 评估括号内的任何内容并将其作为值返回。

    if [[ $(mysql -u $USERNAME -p$PASSWORD -e "$SQL_EXISTS" $DATABASE) ]]
    

    最后我们检查表是否为空。使用以前的方法。基本上我们检查 MySQL 是否会返回空字符串(对于空表),否则查询将返回一些文本作为结果,我们可以认为该表不是空的。

    if [[ $(mysql -u $USERNAME -p$PASSWORD -e "$SQL_IS_EMPTY" $DATABASE) ]]
    

    【讨论】:

      【解决方案2】:

      我认为下面会做你的工作,

      #!/bin/bash
      
      if [ $(mysql -u user -ppassword -hserver dbname -sse "select count(*) from test_dec;") -gt 0 ];
      then
              echo "table not empty"
      else
              echo "table empty"
      fi
      

      您的脚本有 3 处更改,

      1. 将整个mysql语句部分包含在$(..)--&gt;中以使LHS成为$(...)中的结果
      2. 将mysql连接语句--&gt;中的-e更改为-sse,只得到查询结果输出,不带表头和表结构。
      3. != 更改为 -gt --&gt; 运算符以在 bash 中进行整数比较

      【讨论】:

      • 它运行但给了我一个错误第 3 行:[: -gt: unary operator expected
      • 你确定吗,你用过-sse,输出是count(*)
      • 很高兴听到。 (Y)。
      【解决方案3】:

      这应该可以工作

      if [ $(mysql -u root -p -e \
        "select count(*) from information_schema.tables where \
           table_schema='db_name' and table_name='table_name';") -eq 1 ]; then
      echo "table exist"
         exit 1
      else
         echo "table doesn't exist"
         exit 1
      fi
      

      【讨论】:

        【解决方案4】:

        在测试我们是否需要重新导入数据库时​​,这对我有用。

        databasename="mydatabasename";
        tablename="tableweneed";
        dbhost="localhost";
        username="user";
        password="password";
        
        dbtest=$(mysql -h ${dbhost} -u ${username} -p${password} -s -N -e "select count(*) as tablecount from information_schema.tables WHERE table_schema='${databasename}' and table_name='${tablename}'")
        
        if [ "$dbtest" == 1 ]; then
            echo "Database is ok"
        else
            echo "Database is being re-imported"
            mysql -h ${dbhost} -u ${user} -p${password} ${databasename} < /somefolderonmysystem/importdb.sql
        fi
        

        【讨论】:

          【解决方案5】:

          在尝试了几种不同的方法后,这是我们使用的:

          if [[ $(mysql --execute "SHOW TABLES FROM ${DB_NAME} LIKE '${DB_PREFIX}options';") -gt 0 ]]; then
          

          ...是的,我们在脚本前面将mysql 定义为函数,并且数据库名称和数据库前缀也在配置文件中定义(这是我们 SlickStack 项目的一部分)。

          function mysql {
              command mysql --user=root --host=localhost --protocol=socket --port=3306 --force "$@"
          }
          

          您可以根据需要在 bash 脚本中更改此函数的名称。

          示例:https://github.com/littlebizzy/slickstack/blob/master/bash/ss-install-wordpress-config.txt

          【讨论】:

            猜你喜欢
            • 2012-07-06
            • 1970-01-01
            • 2020-07-18
            • 2015-09-13
            • 2013-01-11
            • 1970-01-01
            • 1970-01-01
            • 2010-10-24
            相关资源
            最近更新 更多