【发布时间】: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 INTOtest(somefield) VALUES ('test'); INSERT INTOtest(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 冲突的列/表名称或其中包含不规则字符(如空格),其他所有内容都可以保持原样。