ON UPDATE DUPLICATE KEY中的语法错误?

时间:2017-02-10 16:10:34

标签: mysql

我第一次尝试使用ON UPDATE DUPLICATE KEY子句,跟随此链接

SQL - IF EXISTS UPDATE ELSE INSERT INTO

我的sql语法出错:

  

SQLSTATE [42000]:语法错误或访问冲突:1064您有   SQL语法错误;查看与您的手册相对应的手册   在''AJAY KUMAR'附近使用正确语法的MySQL服务器版本')'   第2行正在执行的SQL是:INSERT INTO fee_acc_balance   (guardian_name,account_no,paid_amount,due,days_overdue,   total_fees,updated_on)VALUES('AJAY KUMAR','10',0,12550,0,   12550,'2017-02-10 21:28:05')ON DUPLICATE KEY UPDATE guardian_name =   VALUES('AJAY KUMAR')错误信息:数组([0] => 42000 [1] => 1064 [2]   =>你有一个错误..

我的唯一键是account_no,这是我的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 个答案:

答案 0 :(得分:2)

您无法在ON DUPLICATE KEY UPDATE中指定绝对值:

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

尝试

ON DUPLICATE KEY UPDATE guardian_name = VALUES(guardian_name)

请注意,作业的正确部分是来自VALUES的新字段,左侧是现存记录; "更新a = VALUES(a)"意味着"将VALUES中的a放入记录"中,而不是"保留所有内容"。

此外,您可能希望用大括号编写变量:

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

甚至更好地使用PDO的PREPARE d语句:

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

,更好的是,bound parameters

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