我正在参考古纳西兰(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;
答案 0 :(得分:0)
这是因为某些字段是字符串类型,如您自己的示例VALUES (1,'BUCKET',7,1,'BOUQUET')
中所示,n_gram
和substitution
的值也应在通过命令传递给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将负责转换为数字。