0

我遇到了一些奇怪的 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 )
)

我的问题是:

结果查询更新了整个表 site_plugin_products_items 与 item_distributor = 176

如果我运行子查询个人:

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

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

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

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

当我看到结果时丢失了 2 年,并且不知道我是否有关闭备份:)

4

1 回答 1

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)

这失败了。

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

于 2018-03-22T12:26:16.993 回答