首页 > 解决方案 > MySQL 查询在 linux shell 脚本中中断,但查询在 mysql 命令行中运行

问题描述

我参考了 Gunaseelan 对这篇文章的回答。如果存在则更新,否则在 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 行的 ERROR 1064 (42000):您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 ''','') ON DUPLICATE KEY UPDATE frequency = frequency+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;

标签: mysqllinux

解决方案


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

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 将负责转换为数字。


推荐阅读