首页 > 解决方案 > 使用别名从视图中更新 MySQL 表

问题描述

我正在尝试从使用别名创建的 SQL 视图更新 MySQL 中的行。我不知道这是否可能。

原始 SQL 如下所示。我已将其保存为视图“ProductVersion”。

SELECT e.entity_id AS id,
       v1.value AS name,
       e.sku,
       d1.value AS version
FROM mguu_catalog_product_entity e
LEFT JOIN mguu_catalog_product_entity_varchar v1 ON e.entity_id = v1.entity_id
AND v1.store_id = 0
AND v1.attribute_id =
  (SELECT attribute_id
   FROM mguu_eav_attribute
   WHERE attribute_code = 'name'
     AND entity_type_id =
       (SELECT entity_type_id
        FROM mguu_eav_entity_type
        WHERE entity_type_code = 'catalog_product'))

LEFT JOIN mguu_catalog_product_entity_varchar d1 ON e.entity_id = d1.entity_id
AND d1.attribute_id = 171;

现在我想从该视图执行 MySQL UPDATE,所以我尝试了:

mysqli_query($db, "UPDATE ProductVersion SET version = '123123123' WHERE sku = '1003'");

这不会返回任何错误 - 但是它不会更新。我也试过这样,但这会产生一个错误:

mysqli_query($db, "UPDATE ProductVersion SET d1.value = '123123123' WHERE e.sku = '1003'");

是否可以从视图中执行 MySQL UPDATE,如果没有,如何从原始 SQL 中最简单地完成?

提前致谢。

标签: phpmysqlmysqli

解决方案


我不知道这是否能解决问题,但我认为你可以像这样简化你的视图(少用无用的选择语句):

SELECT e.entity_id AS id,
   v1.value AS name,
   e.sku as sku,
   d1.value AS version
FROM mguu_catalog_product_entity e
LEFT JOIN mguu_catalog_product_entity_varchar v1 ON (e.entity_id = v1.entity_id)
LEFT JOIN mguu_catalog_product_entity_varchar d1 ON (e.entity_id = d1.entity_id)
LEFT JOIN mguu_eav_attribute AS mea ON (v1.attribute_id = mea.attribute_id)
LEFT JOIN mguu_eav_entity_type AS meet ON (meet.entity_type_code = 'catalog_product')
WHERE v1.store_id = 0
AND mea.attribute_code = 'name'
AND mea.entity_type_id = meet.entity_type_id
AND d1.attribute_id = 171;

在 MySql 文档中:

UPDATE:要在 UPDATE 语句中更新的表或表可能是合并的视图引用。如果视图是连接视图,则视图的至少一个组件必须是可更新的(这与 INSERT 不同)。

在多表 UPDATE 语句中,该语句的更新表引用必须是基表或可更新视图引用。未更新的表引用可能是物化视图或派生表。

https://dev.mysql.com/doc/refman/8.0/en/view-updatability.html


推荐阅读