1

私はMySQLデータベースの数字をチェックする小さなBASHスクリプトを書き込もうとしてecho "AHHH THAT'S ALREADY THERE"います.

mysql --host=192.168.0.0 --user=garfunkle --password=spatulaface mylovelydb << EOF
SELECT * FROM mylittletable WHERE thenumber=$THENUMBER ;
EOF

mysql --host=192.168.0.0 --user=garfunkle --password=spatulaface mylovelydb << EOF
INSERT INTO mylittletable VALUES ('$THENUMBER,'$THEDATE');
EOF

出発点は、MySQL クエリの出力を変数に入れることだと思いますか?

4

2 に答える 2

2

実際、クエリ結果を Bash でテストすることは忘れてください。たった 1 つの SQL クエリで、必要なことを行うことができます (つまり、データが存在しない場合にのみデータを挿入する)。

INSERT INTO mylittletable(thenumber, thedate)
SELECT * FROM (SELECT '$THENUMBER', '$THEDATE') AS tmp
WHERE NOT EXISTS (
    SELECT 1 FROM mylittletable WHERE thenumber = '$THENUMBER'
) LIMIT 1;

さらに簡単:thenumber列が主キーである場合、または列にUNIQUE制約を設定した場合は、次を使用できますINSERT IGNORE(これにより、同じ番号を挿入しようとすると、クエリがサイレントに失敗します)。

INSERT IGNORE INTO mylittletable VALUES ('$THENUMBER','$THEDATE');

個人的には、その 2 番目のオプションを使用します。データにとって意味がある場合は、UNIQUE 制約を作成することを検討してください (またはthenumber、テーブルにまだ主キーがない場合は主キーを作成します)。

ALTER TABLE mylittletable ADD UNIQUE(thenumber);

編集 :

問題が発生した場合に Bash に何かを出力させたい場合は、INSERT(なしでIGNORE) を実行し、mysql クライアント プログラムの終了ステータスを使用します。

echo "INSERT INTO mylittletable VALUES ($THENUMBER,'$THEDATE');" | mysql --host=192.168.0.0 --user=garfunkle --password=spatulaface mylovelydb 2> /dev/null || echo Warning!

または、長いワンライナーが気に入らない場合:

mysql --host=192.168.0.0 --user=garfunkle --password=spatulaface mylovelydb 2> /dev/null << EOF
INSERT INTO mylittletable VALUES ($THENUMBER,'$THEDATE');
EOF

if [ $? -neq 0 ]
then
    echo Warning!
fi

よく知らない場合のために説明すると、||演算子は Bash では次のように使用されます。

# If command1 fails, run command2
command1 || command2
# Silly example
ls myfile 2> /dev/null || echo "No myfile here!"

2> /dev/nullエラーがコンソールに出力されないように、エラーリダイレクトも使用していることに注意してください。

于 2013-08-14T11:42:42.633 に答える
0

これも試すことができます。

#!/bin/bash

if read COUNT < <(mysql --host=192.168.0.0 --user=garfunkle --password=spatulaface -E mylovelydb <<< "SELECT COUNT(*) AS __COUNT__ FROM mylittletable WHERE thenumber=$THENUMBER;" | sed -ne '/^__COUNT__/{ s/^.* //; p; }') && [[ COUNT -gt 0 ]]; then
    echo "AHHH THAT'S ALREADY THERE"
else
    mysql --host=192.168.0.0 --user=garfunkle --password=spatulaface mylovelydb <<< "INSERT INTO mylittletable VALUES ('$THENUMBER,'$THEDATE');"
fi

変数を使用して少し拡張することもできます。

#!/bin/bash

SELECTCOMMAND="SELECT COUNT(*) AS __COUNT__ FROM mylittletable WHERE thenumber=$THENUMBER;"
INSERTCOMMAND="INSERT INTO mylittletable VALUES ('$THENUMBER,'$THEDATE');"

if read COUNT < <(mysql --host=192.168.0.0 --user=garfunkle --password=spatulaface -E mylovelydb <<< "$SELECTCOMMAND" | sed -ne '/^__COUNT__/{ s/^.* //; p; }') && [[ COUNT -gt 0 ]]; then
    echo "AHHH THAT'S ALREADY THERE"
else
    mysql --host=192.168.0.0 --user=garfunkle --password=spatulaface mylovelydb <<< "$INSERTCOMMAND"
fi
于 2013-08-14T12:31:35.823 に答える