1

我正在尝试编写一个小 BASH 脚本来检查 MySQL 数据库中的数字,如果该数字已经在表中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 中测试查询结果。你可以做你想做的事(即仅在数据不存在时插入数据),只需一个 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列是主键,或者如果您对其设置了唯一约束,您可以使用INSERT IGNORE(当您尝试插入相同的数字时,这将使查询静默失败):

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

就个人而言,我会选择第二种选择。如果对您的数据有意义,请考虑创建一个 UNIQUE 约束(或者thenumber如果您的表还没有主键,则创建一个主键):

ALTER TABLE mylittletable ADD UNIQUE(thenumber);

编辑 :

如果您希望 Bash 在出现问题时输出某些内容,只需执行INSERT(without 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 回答