MYSQL:单个查询中的批量插入/更新语句

时间:2016-10-29 19:16:05

标签: mysql batch-processing

我需要做批量 MYSQL插入/更新。我有批量插入语句工作,但当插入多个单行时它不会..同样我无法生成批量更新。请参阅下面的示例。

批量插入语句有效

$sql = "INSERT INTO `test` (`somefield`) VALUES ('test', 'test');";
db::statement($sql);

多个单独的插入语句 NOT 正在工作

$sql = "INSERT INTO `test` (`somefield`) VALUES ('test'); INSERT INTO `test` (`somefield`) VALUES ('test');";
db::statement($sql);
  

SQLSTATE [42000]:语法错误或访问冲突:1064 SQL语法中有错误;查看与MySQL服务器版本对应的手册,以便在第1行的“INSERT INTO testsomefield)VALUES('test')'附近使用正确的语法(SQL:INSERT INTO {{1 } {(1 {}})VALUES('test'); INSERT INTO testsomefield)VALUES('test');)

批量更新声明无法正常工作

test
  

1064 - 您的SQL语法出错;检查与您的MySQL服务器版本相对应的手册,以便在''航班'附近使用正确的语法(somefield$sql = "INSERT INTO 'flights' (`id`, `airline`) VALUES ('142832', 'BA') ON DUPLICATE KEY UPDATE `airline`=VALUES(`airline`);" db::statement($sql); )VALUES('142832','BA')on DUPLICATE KEY UP'at第1行

已审核多个Stackoverflow帖子 - 但我收到了错误

多个插入语句 - Multiple SQL Update Statements in single query

批量更新声明 - Multiple Updates in MySQL

非常感谢这方面的帮助 - 谢谢!

2 个答案:

答案 0 :(得分:3)

这很奇怪。快速浏览一下,看起来批处理语句是错误的,这应该是有效的。

语义正确的批处理语句将括号分隔每行数据,即。像这样:

INSERT INTO test 
VALUES 
  ('test1')
, ('test2')
, ('test3');

单独的insert语句看起来很好,但是,您的数据库驱动程序可能不支持其statement方法中的多个语句(大多数不支持,AFAIK)。解决方法是从客户端启动事务,遍历语句数组并执行。然后,当所有语句都执行时,如果没有错误则提交,或者回滚事务。第一种选择虽然更快。

更新语句不起作用,因为使用单引号引用了表名flights。如果要引用模式/表/列标识符,请使用反向标记,并为字符串值和&保留单引号。日期,正如您在同一查询中的其他位置所做的那样。如果它是一个保留字,只需要转义数据库元素名称,但命名数据库元素如“into”,“user”等是不好的做法,应该避免使用。

INSERT INTO flights (`id`, `airline`) 
VALUES 
('142832', 'BA') 
ON DUPLICATE KEY UPDATE 
airline=VALUES(`airline`)

答案 1 :(得分:1)

尝试取消引用航班,或在上次查询(批量更新声明)中使用后退标记引用它。