【问题标题】:View is not insertable, if it contains sub query in FROM clause如果视图在 FROM 子句中包含子查询,则视图不可插入
【发布时间】:2018-08-08 07:23:37
【问题描述】:

我有一个 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.html1SELECT 语句中谈论子查询,但在FROM 子句中没有提及子查询。

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

【问题讨论】:

    标签: mysql views insert-into


    【解决方案1】:

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

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

    关于可插入性(可通过 INSERT 语句更新),如果可更新视图也满足 视图列的这些附加要求:

    ...

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

    ...

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

    更新

    反映下面 OP 的评论,即子查询确实包含分组和聚合函数 - 上面引用的相同 MySQL 文档也说:

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

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

    • ...

    • 分组方式

    ...

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

    【讨论】:

    • 我展示的子查询是一个简化版本。它确实具有分组依据和聚合列。并且插入也插入了所有没有默认值的列。所有这些列都是视图中Select 子句的一部分。
    • 如果子查询有分组和聚合函数,那么它肯定是不可插入的。子查询甚至不可更新,但可以更新视图的其他部分。顺便说一句,下次请分享所有相关信息以避免此类额外循环。
    • 是的,这可能是真的。但是我在这里展示的简化视图仍然无法插入。我不明白这里简化的 care_note 子查询有什么问题。
    • 让我在这里更清楚。我的实际视图在子查询中有分组依据或聚合列。但我的问题只是与我在问题中提到的观点有关。当您进行工作以不将 care_note 作为子查询的一部分时,我回答说我的子查询具有分组依据或聚合列。但是问题仍然只代表我在问题中所表明的观点。抱歉,这里有任何混淆。
    • 该注释仍然适用。为了使视图可插入,它的所有部分都必须是可更新的。您的子查询不可更新,因此视图不可插入,但可部分更新。
    猜你喜欢
    • 2014-06-21
    • 1970-01-01
    • 2020-02-08
    • 1970-01-01
    • 2014-07-09
    • 1970-01-01
    • 2012-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多