実際、クエリ結果を 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
エラーがコンソールに出力されないように、エラーリダイレクトも使用していることに注意してください。