【问题标题】:Bash script to insert values in MySQL在 MySQL 中插入值的 Bash 脚本
【发布时间】:2018-02-20 15:20:42
【问题描述】:

我想制作一个连接到我的 MySQL 服务器并从 txt 文件中插入一些值的 bash 脚本。 我已经写下来了:

#!/bin/bash
echo "INSERT INTO test (IP,MAC,SERVER) VALUES ('cat test.txt');" | mysql -uroot -ptest test;

但我收到以下错误:

第 1 行出现错误 1136 (21S01):列计数与值计数不匹配 在第 1 行

我想错误在我的 txt 文件中,但我尝试了很多变体,但仍然没有成功的希望。

我的 txt 文件如下所示:

10.16.54.29 00:f8:e5:33:22:3f 马尔萨拉

【问题讨论】:

    标签: mysql sql linux bash scripting


    【解决方案1】:

    试试这个:

    #!/bin/bash
    inputfile="test.txt"
    cat $inputfile | while read ip mac server; do
        echo "INSERT INTO test (IP,MAC,SERVER) VALUES ('$ip', '$mac', '$server');"
    done | mysql -uroot -ptest test;
    

    这样,您可以流式传输文件读取以及 mysql 命令执行。

    【讨论】:

      【解决方案2】:

      假设您有很多行要添加,您可能需要LOAD DATA INFILE 语句,而不是INSERT。源文件必须在服务器上,但这里似乎是这样。

      类似的东西:

      #!/bin/bash
      
      mysql -uroot -ptest test << EOF
      
      LOAD DATA INFILE 'test.txt'
          INTO TABLE tbl_name
          FIELDS TERMINATED BY ' ';
      
      EOF
      

      LOAD DATA INFILE 有很多选项,您会在阅读文档时发现。

      【讨论】:

      • 我在 AWS 上通过 ssh 工作时遇到了问题——使用 LOAD DATA LOCAL INFILE 对我有用。
      【解决方案3】:

      您试图在需要 3 个参数(IP、MAC 和 SERVER)的 INSERT 语句中将值“cat test.txt”作为字符串插入数据库中,因此这就是您收到此错误消息的原因。

      您需要先读取文本文件并提取 IP、MAC 和服务器值,然后在查询中使用这些值,一旦填充后将如下所示:

      #!/bin/bash
      echo "INSERT INTO test (IP,MAC,SERVER) VALUES ('10.16.54.29', '00:f8:e5:33:22:3f', 'marsara');" | mysql -uroot -ptest test;
      

      【讨论】:

        【解决方案4】:

        我使用它并且它有效:

        mysql -uroot -proot < infile
        

        或者先选择数据库

        ./mysql -uroot -proot db_name < infile
        

        或将整个 SQL 复制到剪贴板并粘贴到

        pbpaste > temp_infile && mysql -uroot -proot < temp_infile && rm temp_infile
        

        【讨论】:

          【解决方案5】:
          #!/bin/bash
          
          username=root
          password=root
          dbname=myDB
          host=localhost
          TS=$(date +%s)
          
          echo $1
          mysql -h$host -D$dbname -u$username -p$password -e"INSERT INTO dailyTemp (UTS, tempF) VALUES ($TS, $1);"
          
          exit 0 
          

          【讨论】:

          • 嗨,欢迎来到 SO。由于这个问题还有其他几个被赞成的答案,请考虑添加对您的代码有何不同之处的描述或对其他方法的改进。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-05-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-11-15
          • 1970-01-01
          相关资源
          最近更新 更多