web-dev-qa-db-ja.com

MySQLに値を挿入するBashスクリプト

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マルサラ

14
user2642601

これを試してください:

#!/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コマンドの実行も読み取ります。

20
fejese

追加する行がたくさんあると仮定すると、おそらく 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には、ドキュメントを読んでわかるように多くのオプションがあります。

11
Sylvain Leroux

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;
5
Simon

私はこれを使用して動作します:

mysql -uroot -proot < infile

または最初にデータベースを選択します

./mysql -uroot -proot db_name < infile

または、SQL全体をクリップボードにコピーして貼り付けます

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