【问题标题】:syntax error in ON UPDATE DUPLICATE KEY?ON UPDATE DUPLICATE KEY 中的语法错误?
【发布时间】:2017-06-29 01:29:02
【问题描述】:

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

SQL - IF EXISTS UPDATE ELSE INSERT INTO

我的 sql 语法出现错误:

SQLSTATE[42000]:语法错误或访问冲突:1064 你有一个 SQL 语法错误;检查与您对应的手册 MySQL 服务器版本,用于在 ''AJAY KUMAR')' 附近使用正确的语法 在第 2 行,正在执行的 SQL 是:INSERT INTO fee_acc_balance (guardian_name, account_no,paid_amount, due, days_overdue, total_fees, updated_on) 值 ('AJAY KUMAR', '10', 0, 12550, 0, 12550, '2017-02-10 21:28:05') 重复密钥更新 Guardian_name = 值('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') 

错误在哪里?

【问题讨论】:

  • 您可以将变量定义添加到您的问题中吗? $father_name 来自哪里?
  • 当我问你两个苹果和三个苹果的总和时,这听起来好像你在问苹果成熟与否:)!但是,如果您必须在回答之前知道,$father_name 来自另一个数据库调用。以上所有变量都是通过各种数据库和函数调用来计算的。我确信它们没有必要回答这个问题。相信我,这些信息足以回答。

标签: mysql


【解决方案1】:

您不能在ON DUPLICATE KEY UPDATE 中指定绝对值:

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

试试

ON DUPLICATE KEY UPDATE guardian_name = VALUES(guardian_name)

注意,赋值的右边是从VALUES进来的新字段,左边是现存的记录; “UPDATE a = VALUES(a)”的意思是“将 VALUES 中的 a 放入记录中”,而不是“保持原样”。

另外,您可能希望将变量写在大括号中:

...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
]);

还有,更好的是bound parameters

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

【讨论】:

  • 我不明白的是我在哪里告诉mysql Guardian_name 是$father_name?当我在 ON DUPLICATE KEY UPDATE 语句中写入 VALUES (guardian_name) 而不是 VALUES($father_name) 时,mysql 会自动从我的 insert 语句中选择值吗?
  • 你不需要。您正在尝试将 $father_name 插入到 Guardian_name 中,所以,是的,MySQL 已经知道 VALUES(guardian_name) 是“AJAY KUMAR”。所以你只需要指定 VALUES(guardian_name) 必须进入guardian_name(字段)。
  • 我还可以同时为多个列提供值吗?例如ON DUPLICATE KEY UPDATE (guardian_name, account_no, blah, blah-blah) VALUES (guardian_name, account_no, blah, blah-blah)。我观察到这种方法不起作用。我该怎么做?
猜你喜欢
  • 2021-02-06
  • 1970-01-01
  • 2014-10-18
  • 1970-01-01
  • 2020-07-30
  • 2018-06-27
  • 2011-05-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多