2012-05-22 3 views
2

Существует некоторый странный SQL-процесс. Вот запрос:MySQL Query be VERY Weird

UPDATE sugarcrm.qb_salesorders_leads_c c 
JOIN qb_salesorders orders ON c.qb_salesorders_leadsqb_salesorders_idb = orders.id 
SET c.qb_salesorders_leadsleads_ida = orders.memo 
AND c.qb_salesorders_leadsqb_salesorders_idb = orders.id 

Так что, когда я запускаю это, я получаю 0 строк. Теперь, если я заменил AND на a, он вернется и скажет 354 затронутых строки.

Теперь вы бы подумали, что когда я запустил тот же самый точный запрос с ним, это даст мне тот же результат. НЕПРАВИЛЬНО. Он возвращается с 0 затронутыми рядами.

После этого я могу изменить его, и он снова работает.

Я обнаружил ошибку MySQL или я что-то упустил?

+0

Продолжение этого вопроса: http://stackoverflow.com/questions/10691679/update-query-issues –

ответ

1

При первом запуске синтаксически корректного запроса с запятой он правильно затронул 354 строки. Причина, по которой он возвращается с 0 строк, повлияла на второй раз, так это то, что строки уже были обновлены при первом запуске запроса.

Если значения столбца не будут изменены запросом UPDATE, MySQL не будет обновлять строки, и они не будут учитываться в затронутых строках. Учитываются только те, чьи ценности фактически меняются.

+0

Спасибо, я просто думал, что я схожу с ума ! – Jeff

1

И недопустимый синтаксис для того, что вы пытаетесь сделать. Используйте запятые для разделения каждого столбца, который вы пытаетесь обновить.

0

Вы уже присоединились к c.qb_salesorders_leadsqb_salesorders_idb = orders.id. Поэтому, если вы используете «AND c.qb_salesorders_leadsqb_salesorders_idb = orders.id», чтобы отфильтровать ваши результаты, это как неправильный синтаксис, так и ненужный, поскольку об этом говорится в предложении JOIN.

Если вы хотите установить поле, указанное в предложении AND, соединение будет обновлять только те строки, в которых эти значения уже равны (на основе вашего соединения). Единственная поправка я вижу здесь является то, что вам нужно будет просто удалить «AND» положение, так как он не имеет никакого эффекта, кроме вызывая ошибку в самом запросе:

UPDATE sugarcrm.qb_salesorders_leads_c c 
JOIN qb_salesorders orders ON c.qb_salesorders_leadsqb_salesorders_idb = orders.id 
SET c.qb_salesorders_leadsleads_ida = orders.memo 

В дополнение к этому, чтобы обновить несколько полей , они должны быть разделены запятыми (не Ands):

UPDATE sugarcrm.qb_salesorders_leads_c c 
JOIN qb_salesorders orders ON c.qb_salesorders_leadsqb_salesorders_idb = orders.id 
SET c.qb_salesorders_leadsleads_ida = orders.memo, c.anotherfield = "new value"