如果View包含FROM子句中的子查询,则View不可插入

时间:2018-02-28 12:02:36

标签: mysql views insert-into

我有一个 mysql视图,它在 FROM 子句中有子查询。此视图是可更新的。我尝试更新单个表,它工作正常。但我无法插入该表。它说:

  

错误代码:1471。INSERT的目标表action_view是   不能插入

mysq视图:

    CREATE OR REPLACE
VIEW `action_view` AS
    SELECT 
        `ca`.`id` AS `id`,
        `cah`.`title` AS `title`,
        `ca`.`idCareActionHead` AS `idCareActionHead`,
        `ca`.`idPeople` AS `idPeople`,
        `ca`.`assignedTo` AS `assignedTo`,
        `ca`.`dueDate` AS `dueDate`,
        `note`.idCareAction AS `idCareAction`
    FROM
       `care_action` `ca`
        JOIN `care_action_head` `cah`
        JOIN `people` `p`
        JOIN (SELECT 
            `cn`.`idCareAction` AS `idCareAction`
        FROM `care_note` `cn`) `note`

    WHERE
        `ca`.`idCareActionHead` = `cah`.`id`
            AND (`ca`.`idPeople` = `p`.`id`)
            AND (`note`.`idCareAction` = `ca`.`id`)

更新查询工作正常:

update action_view set idCareActionHead = 1 where action_view.id =25;

插入查询,提出上述错误:

insert into action_view (idCareActionHead, idPeople) values (12, 4);

我已经推荐了最新的mysql文档

https://dev.mysql.com/doc/refman/5.7/en/view-updatability.html 1讨论SELECT语句中的子查询,但没有说明FROM子句中的子查询。

我的问题是,是否有可能在mysql的FROM子句中插入哪个子查询或者我在这里做错了什么?

1 个答案:

答案 0 :(得分:2)

首先,我不明白为什么你在from子句中使用子查询。子查询中没有数据的过滤,分组和格式化,只需从表中选择一个字段即可。您可以直接加入care_note表。

然而,更重要的是,MySQL应用了一个非常明智的restriction on inserts into views

  

关于可插入性(可使用INSERT语句更新),如果可满足需要,则可更新视图是可插入的   视图列的这些附加要求:

     

...

     

•视图必须包含基表中没有的所有列   默认值。

     

...

note子查询的此限制失败,导致收到错误消息。

更新

反映OP下面的注释,子查询确实包含group by和aggregate函数 - 上面引用的相同MySQL文档也说:

  

更具体地说,如果视图包含任何视图,则视图不可更新   以下:

     

•聚合函数(SUM(),MIN(),MAX(),COUNT()等)

     

•......

     

•GROUP BY

     

...

这意味着子查询肯定不可更新。这也意味着视图不能插入,但其他部分仍然可以更新。