提问者:小点点

更新重复密钥时出现语法错误?


我第一次尝试使用ON UPDATE DUPLICATE KEY子句,下面是这个链接

SQL-如果存在更新其他插入到

我得到一个错误,在我的sql语法:

SQLSTATE[42000]:语法错误或访问冲突:1064您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以了解在第2行“AJAY KUMAR”附近使用的正确语法正在执行的SQL是:在重复键上插入费用账户余额(监护人姓名、账号、已付金额、到期日、逾期日、总费用、更新日)值('AJAY KUMAR',10',0,12550,0,12550',2017-02-10 21:28:05')更新guardian_name=VALUES('AJAY KUMAR')错误信息:数组([0]=

在我的情况下,唯一的键是帐户号,这是我的sql:

INSERT INTO fee_acc_balance (guardian_name, account_no, paid_amount, due, days_overdue, total_fees, updated_on) 
VALUES ('$father_name', '$account->account_no', $payments, $sum, 0, $sum,'$now')
ON DUPLICATE KEY UPDATE guardian_name = VALUES ('$father_name') 

错误在哪里?


共1个答案

匿名用户

在重复密钥更新时,不能在中指定绝对值:

ON DUPLICATE KEY UPDATE guardian_name = VALUES ('$father_name') 

试一试

ON DUPLICATE KEY UPDATE guardian_name = VALUES(guardian_name)

请注意,赋值的右边部分是来自VALUES的新字段,左边是现存记录;"UPDATE a=VALUES(a)"意味着"将a从VALUES放入记录",而不是"将所有内容保留为它是"。

此外,您可能希望在花括号中写入变量:

...VALUES ('{$father_name}', '{$account->account_no}', {$payments}, {$sum}, 0, {$sum}, '{$now}')

或者更好地使用带有PDO的PREPAREd语句:

$stmt->prepare("INSERT... VALUES(?, ?, ?, ?, 0, ?, ?)");
$stmt->execute([
    $father_name,
    $account->account_no,
    $payments,
    $sum,
    $sum,
    $now
]);

更好的是,绑定参数。

否则,如果监护人的名字是Ajay Al'Kumar(请注意引号),或者传递的是字符串值而不是整数值,可能会发生奇怪的事情。