【问题标题】:MySQL query breaks in linux shell script, but query runs in mysql command lineMySQL 查询在 linux shell 脚本中中断,但查询在 mysql 命令行中运行
【发布时间】:2019-02-16 15:52:35
【问题描述】:

我参考的是 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;"

ERROR 1064 (42000) at line 1:您的 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;

【问题讨论】:

  • 查看(并发布)变量插入后的最终命令行。您的字段是什么数据类型?取决于此,您应该在 VALUES 中为字符串/日期等添加单引号,例如VALUES($freq, '$Ngram' ... ) 如果 $Ngram 是字符串...实际上,您自己在 MySQL shell 中执行的查询示例表明,应该在 VALUES() 中引用第二个和最后一个参数。

标签: mysql linux


【解决方案1】:

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

mysql --login-path=local SKU_project -N -e "INSERT INTO wordfreqs (频率, n_gram, logic_number, s, 替换) 值 ($freq, '$Ngram', $logicNumber, $S, '$substitution') 重复密钥更新 频率 = 频率+$freq;"

【讨论】:

  • 谢谢。改变了,但仍然中断......现在错误略有不同...... ''','') 而不是 ',')
  • 在 Bash 脚本中,在执行之前打印出(回显)命令行并将其添加到您的问题中。
  • VALUES 子句还有一些问题。这里VALUES (1,'PACER ',,'',''),你有一个省略的值(,,)。那应该是,'',。这里VALUES (15,'JB',S,'S','JB WELD'),没有引用S,应该是'JB','S','S'
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2017-01-14
    • 1970-01-01
    • 1970-01-01
    • 2016-05-09
    • 2021-01-30
    • 1970-01-01
    • 2012-12-22
    • 2021-09-06
    • 2020-01-02
    相关资源
    最近更新 更多