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 * FROM view_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 上有效的主要内容,如果未能解决你的问题,请参考以下文章

Mysql 5.7新特性: JSON字段、虚拟列、视图

MySQL 5.7启动失败

在 Mysql 5.7 中更新用户密码

MySql 5.7 Archive 版本安装失败 解决过程

在Mysql 5.7中更新用户密码

mysql 5.7上用了5.6的备份数据,导致服务启动失败