运行MySql子查询而不是返回错误

时间:2018-03-22 12:07:08

标签: mysql mariadb in-subquery

我遇到了一些奇怪的mysql子查询问题......

UPDATE site_plugin_products_items 
    SET item_distributor = 176
WHERE item_id in ( 
    SELECT item_id 
    FROM `site_plugin_products_field_values` 
    WHERE value_val in ( 554, 1384  , 785 )
)

我的问题是:

结果查询使用item_distributor = 176更新了ENTIRE表site_plugin_products_items

如果我运行子查询个人:

SELECT item_id 
FROM `site_plugin_products_field_values` 
WHERE value_val in ( 554, 1384  , 785 )

我收到以下错误,因为我输错了字段,它应该是value_product,而不是item_id

  

查询错误(1054):“字段列表”中的未知列'item_id'

为什么会这样?难道大查询不应该返回错误而不是弄乱整个表吗?

当我看到结果时失去了2年,并且不知道我是否有一个紧密备份:)

1 个答案:

答案 0 :(得分:3)

在查询中 -

UPDATE site_plugin_products_items 
    SET item_distributor = 176
WHERE item_id in ( 
    SELECT item_id 
    FROM `site_plugin_products_field_values` 
    WHERE value_val in ( 554, 1384  , 785 )
)

由于item_id表中不存在site_plugin_products_field_values,它将使用site_plugin_products_items表中的列。

因为这将始终与条件(item_id总是相等)相同,所以它将更新每一行。

我尝试用某种东西证明这一点(对我自己)......

SELECT * FROM `order` WHERE id in ( select customerID from user u)

这会运行,但用户表没有customerID。但是如果我将别名添加到customerID字段......

SELECT * FROM `order` WHERE id in ( select u.customerID from user u)

这失败了。

简单的解决方案 - 使用别名来确保每列使用哪个表并首先使用正确的列。虽然我不会提到备份!