MySQL无法更新视图,即使它显示为可更新

时间:2019-01-23 00:51:18

标签: mysql view sql-update

我创建了一个视图,其中INNER JOINS有一堆表,但是在MySQL规则下似乎仍然可以更新,但是更新数据似乎无效。这是WorkBench中显示的视图:

CREATE 
    ALGORITHM = UNDEFINED 
VIEW `event_registrants` AS
    SELECT 
        `event_details`.`DTT_EVT_start` AS `Event_Start`,
        `attendee_meta`.`ATT_email` AS `ATT_email`,
        `users`.`ID` AS `ID`,
        `user_detail_tbl`.`first_name` AS `first_name`,
        `user_detail_tbl`.`nickname` AS `nickname`,
        `user_detail_tbl`.`last_name` AS `last_name`,
        `registration`.`EVT_ID` AS `EVT_ID`,
        `posts`.`post_title` AS `post_title`,
        `misc_tbl`.`ANS_value` AS `ANS_value`
    FROM
        ((((((`misc_tbl`
        JOIN `registration` ON ((`misc_tbl`.`REG_ID` = `registration`.`REG_ID`)))
        JOIN `event_details` ON ((`registration`.`EVT_ID` = `event_details`.`EVT_ID`)))
        JOIN `posts` ON ((`posts`.`ID` = `registration`.`EVT_ID`)))
        JOIN `attendee_meta` ON ((`registration`.`ATT_ID` = `attendee_meta`.`ATT_ID`)))
        JOIN `users` ON ((`attendee_meta`.`ATT_email` = `users`.`user_email`)))
        JOIN `user_detail_tbl` ON ((`users`.`ID` = `user_detail_tbl`.`user_id`)))

根据mysqltutorial.org(http://www.mysqltutorial.org/create-sql-updatable-views.aspx),可以使用来检查其视图是否可更新

SELECT 
    table_name, 
    is_updatable
FROM
    information_schema.views

查询的输出表明我的视图是可更新的(is_updatable = YES

出于某种原因,需要进行简单的更新,例如:

UPDATE event_registrants
SET nickname='Terminator'
WHERE first_name='John';

收益Error Code: 1288. The target table event registrants of the UPDATE is not updatable

1 个答案:

答案 0 :(得分:3)

对于任何可更新的视图,引擎都应该能够将每个结果行与主/核心表的单个基础行相匹配。

在大多数数据库引擎上都是如此,而不仅仅是MySQL。重要的是要注意,每个数据库引擎对可更新视图都施加类似/额外的要求。

在您的特定情况下,您使用的INNER JOIN(最有可能)将导致与每个基本行相关的多个结果行。即使MySQL将其标记为可更新,它也可能无法执行。