2017-02-10 7 views
0

Я пытался использовать ON UPDATE DUPLICATE положение KEY в первый раз, по этой ссылкеОшибка синтаксиса в 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) VALUES ('AJAY KUMAR', '10', 0, 12550, 0, 12550, '2017-02-10 21:28:05') ON DUPLICATE KEY UPDATE guardian_name = VALUES ('AJAY KUMAR «) Error Info: Array ([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') 

Где ошибка?

+0

Можете вы добавить определения переменных к вашему вопросу? Откуда возникает $ father_name? – Nathan

+0

это звучит так, будто вы спрашиваете, созревают ли яблоки или нет, когда я спрашиваю вас о сумме двух яблок и трех яблок :)! Но если вы должны знать, прежде чем отвечать, $ father_name приходит из другого вызова базы данных. все вышеперечисленные переменные вычисляются с помощью различных запросов к базе данных и функций. Я уверен, что они не нужны, чтобы иметь возможность ответить на этот вопрос. Поверьте мне, информации достаточно, чтобы ответить. –

ответ

2

Вы не можете указать абсолютное значение в ON DUPLICATE KEY UPDATE:

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

Try с

ON DUPLICATE KEY UPDATE guardian_name = VALUES(guardian_name) 

Обратите внимание, что правая часть задания является новым полем, поступающее из VALUES, и с левой стороны это сохранившаяся запись; «ОБНОВЛЕНИЕ a = ЦЕННОСТИ (a)« означает «положить a из VALUES в запись», а не «оставить все как есть».

Кроме того, вы можете написать переменные в фигурные скобки:

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

или даже лучше использовать PREPARE d заявление с PDO:

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

и, еще лучше, bound parameters.

В противном случае могут возникнуть странные вещи, если имя хранителя - Ajay Al'Kumar (обратите внимание на метку кавычки) или передается строковое значение вместо целочисленного.

+0

что я не понимаю, где я могу указать mysql, что guardian_name - $ father_name? Будет ли mysql автоматически выбирать значения из моего оператора insert, когда я пишу 'VALUES (guardian_name)' в инструкции ON DUPLICATE KEY UPDATE, вместо 'VALUES ($ father_name)'? –

+1

Вам не нужно. Вы пытаетесь вставить $ father_name в guardian_name, так что да, MySQL уже знает, что VALUES (guardian_name) является «AJAY KUMAR».Поэтому вам нужно только указать, что VALUES (guardian_name) должно войти в 'guardian_name' (поле). – LSerni

+0

Могу ли я также указать значения для нескольких столбцов одновременно? например 'ON DUPLICATE KEY UPDATE (guardian_name, account_no, blah, blah-blah) VALUES (guardian_name, account_no, blah, blah-blah)'. Я заметил, что этот метод не работает. Как мне это сделать? –

Смежные вопросы