如何通过Bash直接更新MySQL表?解决1046未选库报错
解决Bash中直接执行MySQL更新命令的1046报错问题
嘿,我来帮你搞定这个问题!你碰到的ERROR 1046 (3D000)是因为你当前尝试的代码里,USE ${tmpdb};和后续的UPDATE命令没有在同一个MySQL连接里执行,导致执行UPDATE时没有选中目标数据库。
正确的实现方法有这几种:
方法1:将多个SQL命令合并到同一个-e参数中
把USE语句和UPDATE语句用分号分隔,放在同一个-e引号里,这样它们会在同一个连接中执行:
mysqlword="xyzzy" tmpdb="yyyy" mysql -u root -p$mysqlword -e"USE ${tmpdb}; UPDATE wp_posts SET post_content = replace(post_content, 'domain1', 'domain2');"
方法2:使用多个-e参数传递多条SQL命令
每个-e对应一条SQL语句,MySQL会在同一个连接里依次执行这些命令:
mysqlword="xyzzy" tmpdb="yyyy" mysql -u root -p$mysqlword -e"USE ${tmpdb};" -e"UPDATE wp_posts SET post_content = replace(post_content, 'domain1', 'domain2');"
方法3:直接指定目标数据库(最简洁高效)
其实根本不需要写USE语句,在mysql命令后面直接加上数据库名即可,这样所有后续的SQL命令都会默认在这个数据库下执行:
mysqlword="xyzzy" tmpdb="yyyy" mysql -u root -p$mysqlword ${tmpdb} -e"UPDATE wp_posts SET post_content = replace(post_content, 'domain1', 'domain2');"
额外提醒
- 直接在命令行暴露密码存在安全风险,建议通过
~/.my.cnf配置文件来存储用户名和密码,格式如下:
之后执行命令时就可以省略[client] user=root password=xyzzy-u root -p$mysqlword部分,直接写mysql ${tmpdb} -e"..."即可。 - 如果你的密码或数据库名包含特殊字符(比如空格、引号),记得给变量加上双引号,比如
-p"$mysqlword"和"${tmpdb}",避免解析错误。
内容的提问来源于stack exchange,提问作者user7988893
相关产品推荐
相关产品推荐

