Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用PDO进行重复密钥更新时出现语法错误或访问冲突1064_Php_Mysql_Sql - Fatal编程技术网

Php 使用PDO进行重复密钥更新时出现语法错误或访问冲突1064

Php 使用PDO进行重复密钥更新时出现语法错误或访问冲突1064,php,mysql,sql,Php,Mysql,Sql,我有以下代码来插入新行或更新现有行,因为id在表中是唯一的: $sql = "INSERT INTO table(id, columnTwo, columnThree, columnFour) VALUES (:id, :columnTwo, :columnThree, :columnFour) ON DUPLICATE KEY UPDATE (columnTwo=:columnTwo, columnThree=:columnThree, columnFour=:columnFour)"

我有以下代码来插入新行或更新现有行,因为
id
在表中是唯一的:

$sql = "INSERT INTO table(id, columnTwo, columnThree, columnFour)    
VALUES (:id, :columnTwo, :columnThree, :columnFour) ON DUPLICATE KEY UPDATE (columnTwo=:columnTwo, columnThree=:columnThree, columnFour=:columnFour)"; 

$stmt = $conn->prepare($sql);

$stmt->bindParam(':id', $id);
$stmt->bindParam(':columnTwo', $columnTwo);
$stmt->bindParam(':columnThree', $columnThree);
$stmt->bindParam(':columnFour', $columnFour);

$stmt->execute();
如果我删除重复密钥更新上的
部分,它将插入没有问题的行(假设唯一密钥
id
不存在),但添加此部分时,我会得到以下错误:

语法错误或访问冲突:1064您的SQL中有错误 句法;检查与MySQL服务器版本对应的手册 要使用near'(columnTwo='some_value')的正确语法, 第3行的columnThree='some_value',columnFour='some_value')'


MYSQL语法说明
分配列表
的格式如下:

assignment_list:
    assignment [, assignment] ...
重复密钥更新时的
语法为:

[ON DUPLICATE KEY UPDATE assignment_list] 
根据语法,不允许使用括号。 将其与值的语法进行比较:

{VALUES | VALUE} (value_list) [, (value_list)] ...

MYSQL语法声明
分配列表的格式为:

assignment_list:
    assignment [, assignment] ...
重复密钥更新时的
语法为:

[ON DUPLICATE KEY UPDATE assignment_list] 
根据语法,不允许使用括号。 将其与值的语法进行比较:

{VALUES | VALUE} (value_list) [, (value_list)] ...

更新后,请尝试不使用括号,这样做有效!谢谢you@deceze你确定这符合拼写错误吗?在我看来,这是对语法的误解,这就是我回答的原因。拼写错误可能是一个意外错误。请在更新后尝试不使用括号!谢谢you@deceze你确定这是打字错误吗这是对语法的误解,这就是我回答的原因。输入错误可能是一个意外错误。这不是MySQL语法,而是某种BNF(Backus–Naur表单)语法..但是如果你不知道语法规则,就很难阅读和理解。关于如何在重复密钥更新中使用
的最佳示例是@RaymondNijland该页面的标题是“插入语法”.BNF是描述语法IMHO的标准和最容易理解的符号。您链接的页面给出了如何使用它的示例,但没有定义语法。“BNF是描述语法IMHO的标准和最容易理解的符号。”我知道,我敢肯定不是每个程序员都知道如何阅读它,以及如何使用BNF将其“转换”为有效的SQL语法查询。这就是为什么我加入了SQL示例。在某些情况下,MySQL文档中的BNF没有定义SQL语法中的所有可能性。这就是为什么我说我很难阅读和理解,以及如何将BNF转换为有效的SQL语法。。例如,INSERT
VALUES()
被定义为<代码>值:{expr | DEFAULT}值列表:值[,值]
{VALUES |值}(值列表)[,(值列表)]…
并且没有定义
expr
那么BNF语法中的
expr
是什么呢?现在我知道了(我的)SQL语法,所以我知道BNF在这里表示anny有效(我的)SQL表达式,例如
。。。值((选择1))
是validit的不是MySQL语法,而是某种BNF(Backus–Naur表单)语法。。但是当你不知道语法规则时,阅读和理解起来会很困难。关于如何在重复密钥更新中使用
的最佳示例是@RaymondNijland,该页面的标题字面上是“插入语法”。BNF是描述语法IMHO的标准和最容易理解的符号。您链接的页面给出了如何使用它的示例,但没有定义语法。“BNF是描述语法IMHO的标准和最容易理解的符号。”我知道,我敢肯定不是每个程序员都知道如何阅读它,以及如何使用BNF将其“转换”为有效的SQL语法查询。这就是为什么我加入了SQL示例。在某些情况下,MySQL文档中的BNF没有定义SQL语法中的所有可能性。这就是为什么我说我很难阅读和理解,以及如何将BNF转换为有效的SQL语法。。例如,INSERT
VALUES()
被定义为<代码>值:{expr | DEFAULT}值列表:值[,值]
{VALUES |值}(值列表)[,(值列表)]…
并且没有定义
expr
那么BNF语法中的
expr
是什么呢?现在我知道了(我的)SQL语法,所以我知道BNF在这里表示anny有效(我的)SQL表达式,例如
。。。值((选择1))
有效