第1行的错误1046(3D000):未选择数据库

时间:2018-04-26 06:56:19

标签: mysql bash

我想直接用bash而不是mysql终端更新一些表 通常的方法是使用此处的doc string在bash中使用ebedded sql命令。

mysqlword="xyzzy"
tmpdb="yyyy"
mysql -u root -p$mysqlword  <<EOF
    USE ${tmpdb};
    UPDATE wp_posts SET post_content = replace(post_content, 'domain1', 'domain2');
EOF

尝试其他方式做同样的工作。

mysqlword="xyzzy"
tmpdb="yyyy"
mysql -u root -p$mysqlword  -e"USE ${tmpdb};"
sql="UPDATE wp_posts SET post_content = replace(post_content, 'domain1', 'domain2');"
mysql -u root -p$mysqlword  -e"$sql"
ERROR 1046 (3D000) at line 1: No database selected

我在mysql -u root -p$mysqlword -e"USE ${tmpdb};"之前选择了mysql -u root -p$mysqlword -e"$sql"数据库,如何解决?

2 个答案:

答案 0 :(得分:2)

每次打开连接时都必须USE数据库。所以你必须结合这两个命令:

mysqlword="xyzzy"
tmpdb="yyyy"
sql="USE ${tmpdb}; UPDATE wp_posts SET post_content = replace(post_content, 'domain1', 'domain2');"
mysql -u root -p$mysqlword  -e"$sql"

答案 1 :(得分:1)

您可以通过以下几种方式修复/简化:

  1. 删除单独的USE声明。
  2. 从命令行中删除用户凭据。
  3. 直接在UPDATE语句中引用数据库名称:

    sql="UPDATE wp_posts SET ${tmpdb}.post_content = replace(post_content, 'domain1', 'domain2');"
    

    如果你的版本是mysql&gt; = 5.6.6,请使用mysql_config_editor将登录凭据放入.mylogin.cnf文件中。它将节省输入,密码将被加密。

    e.g。

    mysql_config_editor --login-path=root --user=root --host=localhost --password
    

    设置后,您的bash命令将更简单(更安全)

    tmpdb=yyyy
    sql="UPDATE wp_posts SET ${tmpdb}.post_content = replace(post_content, 'domain1', 'domain2');"
    mysql --login-path=root -e "$sql" 
    

    或者,因为这里不需要变量,

    mysql --login-path=root -e "UPDATE wp_posts SET yyyy.post_content = replace(post_content, 'domain1', 'domain2');"