我遇到了一些奇怪的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年,并且不知道我是否有一个紧密备份:)
答案 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)
这失败了。
简单的解决方案 - 使用别名来确保每列使用哪个表并首先使用正确的列。虽然我不会提到备份!