MySQL:更新视图在 MySQL 5.7 上失败,但在 5.6 上有效
Posted
技术标签:
【中文标题】MySQL:更新视图在 MySQL 5.7 上失败,但在 5.6 上有效【英文标题】:MySQL: Update a view fails on MySQL 5.7 but works on 5.6 【发布时间】:2017-02-15 12:05:59 【问题描述】:此查询在 mysql 5.7 上失败
UPDATE `view_alm` SET `cantidad_de_producto`='3' WHERE `id_producto`='43' LIMIT 1;
相同的查询适用于 MySQL 5.5 和 5.6。需要强调的是“view_alm”是一个视图表。
在 MySQL 5.7 上查询结果为“error: The target table view_alm of the UPDATE is not updatable”。
我阅读了 MySQL 文档中名为“可更新和可插入视图”的部分:documentation
我还在我的两个测试环境中检查了一些参数(一个环境是 MySQL 5.7,另一个是 MySQL 5.5)。
查询“显示变量;”在两种情况下都返回“updatable_views_with_limit | YES”。 在“INFORMATION_SCHEMA.VIEWS”中,标志“IS_UPDATABLE”在这两种情况下都设置为“YES”。这是视图:
select `P`.`id_producto` AS `id_producto`,`P`.`id_cliente` AS `id_cliente`,`P`.`id_producto_definicion` AS `id_producto_definicion`,`P`.`caducidad` AS `caducidad`,`P`.`lote` AS `lote`,`P`.`cantidad_de_producto` AS `cantidad_de_producto`,`P`.`referencia_de_producto` AS `referencia_de_producto`,`P`.`id_tipo_stock` AS `id_tipo_stock`,`TS`.`nombre_stock` AS `nombre_stock`,`B`.`id_bulto` AS `id_bulto`,`BDEF`.`nombre` AS `nombre_bulto`,`C`.`id_contenedor` AS `id_contenedor`,`CDEF`.`nombre` AS `nombre_contenedor`,`U`.`id_ubicacion` AS `id_ubicacion`,`UDEF`.`codigo_de_ubicacion` AS `codigo_de_ubicacion` from ((((((((`productos` `P` left join `productos_definiciones` `PDEF` on((`P`.`id_producto_definicion` = `PDEF`.`id_producto_definicion`))) left join `bultos` `B` on((`B`.`id_bulto` = `P`.`bulto`))) left join `bultos_definiciones` `BDEF` on((`B`.`id_bulto_definicion` = `BDEF`.`id_bulto_definicion`))) left join `contenedores` `C` on((`B`.`contenedor` = `C`.`id_contenedor`))) left join `contenedores_definiciones` `CDEF` on((`C`.`id_contenedor_definicion` = `CDEF`.`id_contenedor_definicion`))) left join `ubicaciones` `U` on((`C`.`ubicacion` = `U`.`id_ubicacion`))) left join `ubicaciones_definiciones` `UDEF` on((`U`.`id_ubicacion_definicion` = `UDEF`.`id_ubicacion_definicion`))) left join `tipo_stock` `TS` on((`P`.`id_tipo_stock` = `TS`.`id_tipo_stock`))) order by `P`.`caducidad`
谁能给我一些线索?
【问题讨论】:
由于您阅读了文档,您可能已经阅读到此标志可能不可靠,具体取决于实际的视图代码。所以你必须添加实际的视图代码。另外:仅从您的视图中选择是否会返回您要更新的正确行? 我刚刚用视图代码更新了问题。 更多信息:此查询工作正常 "SELECT * FROMview_alm
WHERE id_producto
='43' LIMIT 1;"
【参考方案1】:
已修复!
改变了这个:
UPDATE `view_alm` SET `cantidad_de_producto`='3' WHERE `id_producto`='43' LIMIT 1;
为:
UPDATE `productos` SET `cantidad_de_producto`='3' WHERE `id_producto`='43' LIMIT 1;
字段“cantidad_de_producto”和“id_producto”来自表“productos”。在这种情况下,解决方案是修改表“productos”而不是“view_alm”上的数据。
【讨论】:
没有解决核心问题。以上是关于MySQL:更新视图在 MySQL 5.7 上失败,但在 5.6 上有效的主要内容,如果未能解决你的问题,请参考以下文章