【发布时间】: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() 中引用第二个和最后一个参数。