我试图在一个表上运行insert或update—当copy粘贴到heidisql中时,从下面生成的字符串可以正常工作,但是抛出 SQLSyntaxErrorExceptions
从java运行时:
Statement statement = con.createStatement();
String escapedXML = EscapeString(billboard.getXml());
String sql = String.format(
"DELIMITER $ \r\nBEGIN NOT ATOMIC\r\n" +
"IF EXISTS(SELECT * FROM billboards where Name='%s') THEN UPDATE billboards SET XML='%s' where Name='%s';\r\n" +
"ELSE insert into billboards(Name, XML, CreatorName) values('%s', '%s', '%s');\r\n" +
"END IF;\r\n" +
"END $\r\n" +
"DELIMITER ;", billboard.getName(), escapedXML, billboard.getName(), billboard.getName(), escapedXML, billboard.getCreatorName());
// Insert or update billboard
statement.execute(sql);
我不明白为什么。
3条答案
按热度按时间qvsjd97n1#
我建议使用
insert ... ok duplicate key
语法而不是代码块。这样效率更高,只需一条语句就可以实现锁定,这样可以避免从php代码运行查询时遇到的问题。为此,需要对列设置唯一(或主键)约束
Name
.另外,考虑使用参数化查询而不是在查询中串联变量stringw escaping效率低下,也不会真正使代码更安全。
mrzz3bfm2#
你应该试试
NamedParameterStatement
使用您的查询以方便设置字符串参数并避免它们的重复(使用gmb先前回答中建议的重构查询):up9lanfz3#
出现语法错误的原因是
DELIMITER
是mysql客户机命令,而不是sql语句。mysql命令不能与jdbc一起使用。更多信息:
mysql中的分隔符