Bash脚本插入MySQL值

16

我希望制作一个Bash脚本,连接到我的MySQL服务器并从文本文件中插入一些值。 我已经写下了以下代码:

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

但我收到了以下错误:

ERROR 1136 (21S01) 在第1行: 列数与值数不匹配,在第1行

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

我的txt文件看起来像这样:

10.16.54.29 00:f8:e5:33:22:3f marsara

5个回答

21

试试这一个:

#!/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命令执行。


10

假设您需要添加许多行,您可能需要使用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解决了这个问题。 - Joe

5

您想将值"cat test.txt"作为字符串插入到需要3个参数(IP、MAC和SERVER)的INSERT语句中,因此导致出现此错误消息。

您需要先读取文本文件并提取出IP、MAC和Server值,然后再使用这些值填充以下查询:

#!/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;

3
我使用这个方法,它有效:

mysql -uroot -proot < infile

或先选择数据库。
./mysql -uroot -proot db_name < infile

或者将整个SQL复制到剪贴板中,并使用粘贴功能。
pbpaste > temp_infile && mysql -uroot -proot < temp_infile && rm temp_infile

1
#!/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 

7
你好,欢迎来到SO。由于这个问题已经有其他一些得到赞同的答案了,考虑添加对你的代码与其他方法不同或具有改进的描述。 - rmlockerd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接