Mysql обновить подзапрос указать целевую таблицу - PullRequest
0 голосов
/ 31 марта 2011

У меня проблемы с обновлением final_id, выбрав самый высокий final_id уже в таблице и добавив + 1.

В приведенном ниже запросе выводится ошибка: «Вы не можете указать целевую таблицу customer_orders для обновления в предложении FROM», и я, к сожалению, не понимаю, почему ..

UPDATE customer_orders 
  SET final_id = (SELECT final_id FROM customer_orders ORDER BY final_id DESC)+1, 
      status = 2, 
      payment_id = '{$transaction_id}', 
      payment_type = '{$type}', 
      payment_reserved = '{$amount}', 
      payment_currency = '{$cur}', 
      payment_cardnopostfix = '{$postfix}', 
      payment_fraud_suspicious = '{$fraud}' 
  WHERE id = '{$order_id}'

Я пытаюсь установить уникальный идентификатор увеличения для завершенных заказов в моей системе.

Надеюсь, кто-нибудь подскажет, что я делаю не так!

С наилучшими пожеланиями

Ответы [ 3 ]

1 голос
/ 31 марта 2011

Вы можете переписать свой запрос и использовать соединение

UPDATE customer_orders 
INNER JOIN (SELECT IFNULL(MAX(final_id),0) as max_id FROM customer_orders)a ON(1=1)
SET final_id = a.max_id+1, status = 2, payment_id = '{$transaction_id}', 
payment_type = '{$type}', payment_reserved = '{$amount}', 
payment_currency = '{$cur}', payment_cardnopostfix = '{$postfix}',
payment_fraud_suspicious = '{$fraud}' 
WHERE id = '{$order_id}'
0 голосов
/ 31 марта 2011

Попробуйте это:

 UPDATE customer_orders        
    SET final_id = MT.MaxId + 1           -- use the computed max id, and increment
      , status = 2
      , payment_id = '{$transaction_id}'
      , payment_type = '{$type}'
      , payment_reserved = '{$amount}'
      , payment_currency = '{$cur}'
      , payment_cardnopostfix = '{$postfix}'
      , payment_fraud_suspicious = '{$fraud}'
   FROM customer_orders
      -- include a subquery to determine the max id from the customer_orders table
      -- and assign 'MT' as the name of the results table
      , (SELECT MAX(final_id) as MaxId FROM customer_orders) MT
  WHERE id = '{$order_id}'
0 голосов
/ 31 марта 2011

изменить внутренний запрос на SELECT max(final_id) FROM customer_orders

...