MYSQL:在单个查询中批量处理 insert/update 个语句

MYSQL: Batch insert/update statements in single query

我需要做 批处理 MYSQL insert/updates。我有批量插入语句可以工作,但是当插入以多个单行形式出现时它不会。同样我无法生成批量更新。请参阅下面的示例。

批处理 插入语句有效

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

多个 单独的插入语句NOT working

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

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INSERT INTO test (somefield) VALUES ('test')' at line 1 (SQL: INSERT INTO test (somefield) VALUES ('test'); INSERT INTO test (somefield) VALUES ('test');)

批量更新语句无效

$sql = "INSERT INTO 'flights' (`id`, `airline`) VALUES ('142832', 'BA') ON DUPLICATE KEY UPDATE `airline`=VALUES(`airline`);"
db::statement($sql);

1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''flights' (id, airline) VALUES ('142832', 'BA') ON DUPLICATE KEY UP' at line 1

查看了多个 Whosebug 帖子 - 但我遇到了一些问题

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

批量更新语句 - Multiple Updates in MySQL

希望得到帮助 - 谢谢!

尝试取消对 flights 的引用,或者在上次查询(批量更新语句)中用反引号将其引用。

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

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

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

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

更新语句不起作用,因为 tablename flights 是使用单引号引起来的。如果您想引用架构/table/列标识符,请使用反引号,并为字符串值和日期保留单引号,就像您在同一查询的其他地方所做的那样。如果数据库元素名称是保留字,则只需要对其进行转义,但将数据库元素命名为 'into'、'user' 等是不好的做法,应该避免。

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