MySQL查询在Linux Shell脚本中中断,但查询在mysql命令行中运行

时间:2019-02-14 15:11:48

标签: mysql linux

我正在参考古纳西兰(Gunaseelan)的答案。 UPDATE if exists else INSERT in SQL

我在编写查询以更新是否存在其他问题(插入MySQL)时遇到问题,但是Gunaseelan的解决方案在mysql命令行上工作得很好。但是,当我尝试在bash脚本中使用它时,它会中断。我似乎看不到这里出了什么问题,可以真的用另一双眼睛帮我弄清楚。

mysql> describe wordfreqs;
+--------------+--------------+------+-----+---------+----------------+
| Field        | Type         | Null | Key | Default | Extra          |
+--------------+--------------+------+-----+---------+----------------+
| id           | int(11)      | NO   | PRI | NULL    | auto_increment |
| frequency    | int(11)      | NO   |     | NULL    |                |
| n_gram       | varchar(100) | NO   | UNI | NULL    |                |
| logic_number | int(11)      | YES  |     | NULL    |                |
| s            | tinyint(4)   | YES  |     | NULL    |                |
| substitution | varchar(100) | YES  |     | NULL    |                |
+--------------+--------------+------+-----+---------+----------------+

数据:

1,PACER ,,,
1,LIQUID NAILS,,,
1,F P C,,,
1,ACE ,,,
3,SIMPSON,,,
1,SUREBONDER,,,
1,DO IT BEST,,,
1,LIQUID NAILS,,,
1,JACKSON,,,
1,DURO,,,
15,JB,1,S,JB WELD
13,DEVIL,1,S,RED DEVIL


mysql> INSERT INTO wordfreqs (frequency, n_gram, logic_number, s, substitution) VALUES (1,'BUCKET',7,1,'BOUQUET') ON DUPLICATE KEY UPDATE frequency = frequency+10;

查询确定,受影响的2行(0.04秒)

mysql> SELECT * FROM wordfreqs;                                                                                                                                 +----+-----------+--------+--------------+------+--------------+
| id | frequency | n_gram | logic_number | s    | substitution |
+----+-----------+--------+--------------+------+--------------+
|  1 |        22 | BUCKET |            7 |    1 | BOUQUET      |
+----+-----------+--------+--------------+------+--------------+
1 row in set (0.00 sec)

但是在bash脚本中我得到了不同的结果...

mysql --login-path=local SKU_project -N -e "INSERT INTO wordfreqs (frequency, n_gram, logic_number, s, substitution) VALUES ($freq,'$Ngram',$logicNumber,'$S','$substitution') ON DUPLICATE KEY UPDATE frequency = frequency+$freq;"

第1行的错误1064(42000):您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册以获取正确的语法,以在''',''附近使用)在第1行的重复键更新频率=频率+393'

任何帮助将不胜感激。 :-)

感谢@ marekful。 这是几个echo语句的输出:

INSERT INTO wordfreqs (frequency, n_gram, logic_number, s, substitution)
               VALUES (1,'PACER ',,'','') ON DUPLICATE KEY UPDATE frequency = frequency+1;
INSERT INTO wordfreqs (frequency, n_gram, logic_number, s, substitution)
               VALUES (15,'JB',S,'S','JB WELD') ON DUPLICATE KEY UPDATE frequency = frequency+15;
INSERT INTO wordfreqs (frequency, n_gram, logic_number, s, substitution) VALUES (13,'DEVIL',S,'S','RED DEVIL') ON DUPLICATE KEY UPDATE frequency = frequency+13;

2 个答案:

答案 0 :(得分:0)

这是因为某些字段是字符串类型,如您自己的示例VALUES (1,'BUCKET',7,1,'BOUQUET')中所示,n_gramsubstitution的值也应在通过命令传递给MySQL的字符串中引用行:

  

mysql --login-path = local SKU_project -N -e“ INSERT INTO wordfreqs   (频率,n_gram,逻辑编号,s,替换)VALUES($ freq,   '$ Ngram',$ logicNumber,$ S,'$ substitution')在重复键更新上   频率=频率+ $ freq;“

答案 1 :(得分:0)

该错误在您生成的查询中可见:

INSERT INTO wordfreqs (frequency, n_gram, logic_number, s, substitution)
       VALUES (1,'PACER ',,'','') ON DUPLICATE KEY UPDATE frequency = frequency+1;
INSERT INTO wordfreqs (frequency, n_gram, logic_number, s, substitution)
       VALUES (15,'JB',S,'S','JB WELD') ON DUPLICATE KEY UPDATE frequency = frequency+15;

字段logic_number存储一个数字(INT(11)),但是您在VALUES列表中的查询中输入了一个字符串。另外,在第一个查询中,该值丢失。

检查设置$logicNumber的代码;似乎使用了错误的值。

如果您确定$logicNumber包含正确的值,则可以使用$((logicNumber))从中产生一个数字(即使其值为空字符串)。

如果$logicNumber的值不是数字,则$((logicNumber))0。但是,如果$logicNumber是一个以数字开头的字符串,那么$((logicNumber))的求值会产生错误。计算$logicNumber的值时要考虑到这一点。

或者,您可以将$logicNumber的值放在查询的撇号中,MySQL将负责转换为数字。