MySQL查询非常奇怪

时间:2012-05-22 20:55:32

标签: mysql

有一些奇怪的SQL正在进行中。这是查询:

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替换AND,那么它会回来并说354行受到影响。

现在你会想到当我用它运行相同的确切查询时,它会给我相同的结果。错误。它回来了0行受影响。

之后,我可以将,更改为AND,然后再次运行。

我是否发现了MySQL Bug或者我在这里遗漏了什么?

3 个答案:

答案 0 :(得分:1)

AND不是您尝试执行的操作的有效语法。使用逗号分隔您尝试更新的每个列。

答案 1 :(得分:1)

第一次使用逗号运行语法正确的查询时,它正确地影响了354行。它第二次返回0行的原因是第一次运行查询时行已经更新

如果UPDATE查询不会更改列值,MySQL将不会更新行,并且不会在受影响的行中计算它们。只计算其值实际发生变化的人。

答案 2 :(得分: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

除此之外,要更新多个字段,它们应该用逗号分隔(而不是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, c.anotherfield = "new value"