【问题标题】:MYSQL: Batch insert/update statements in single queryMYSQL:单个查询中的批量插入/更新语句
【发布时间】:2016-10-30 03:48:40
【问题描述】:

我需要进行批处理 MYSQL 插入/更新。我让批量插入语句起作用,但是当插入作为多个单衬时它不会。同样我无法生成批量更新。请参阅下面的示例。

批处理插入语句有效

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

多个单独的插入语句工作

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

SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“INSERT INTO test (somefield) VALUES ('test')' 附近使用正确的语法(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 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 ''flights' (id, airline) VALUES ('142832', 'BA') ON DUPLICATE KEY UP' 附近使用正确的语法

查看了多个 Stackoverflow 帖子 - 但我遇到了问题

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

批量更新声明-Multiple Updates in MySQL

不胜感激 - 谢谢!

【问题讨论】:

  • 您只能使用该函数一次执行一条语句。不要使用多语句命令,这只是麻烦。为什么不提供像(?,?),(?,?) 这样的值列表,准备一条语句并执行多次,或者使用CSV 文件和LOAD DATA INFILE 将其整体导入?记住;只对mysql命令行工具有意义,它是默认的分隔符,但是MySQL驱动没有这个概念,你必须把单独的语句打包。
  • 此外,表名和列名也使用反引号 ` 进行转义,默认情况下字符串使用单引号或双引号。您通常只需要转义与MySQL reserved keywords 冲突的列/表名称或其中包含不规则字符(如空格),其他所有内容都可以保持原样。

标签: mysql batch-processing


【解决方案1】:

这很奇怪。乍一看,批处理语句似乎是错误的,这应该是有效的。

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

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

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

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

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

【讨论】:

  • 谢谢 - 绝对正确!感谢明确的答案。将不得不研究交易选项
【解决方案2】:

尝试取消引用 flights,或在最后一个查询(批量更新语句)中用反引号引用它。

【讨论】:

    猜你喜欢
    • 2010-10-14
    • 2013-03-15
    • 1970-01-01
    • 2022-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    相关资源
    最近更新 更多