我有一个mysql视图,它在FROM子句中有子查询。此视图是可更新的。我尝试更新单个表,它工作正常。但我无法插入该表。它说 :
错误代码:1471。INSERT的目标表action_view不可插入
mysql视图:
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.html1讨论SELECT
语句中的子查询,但没有说明FROM
子句中的子查询。
我的问题是,是否有可能插入到mysql中的FROM
子句中有子查询的视图中,或者我在这里做错了什么?
首先,我不明白为什么你在from
条款中使用子查询。子查询中没有数据的过滤,分组和格式化,只需从表中选择一个字段即可。您可以直接加入care_note
表。
但是,更重要的是MySQL应用了一个非常明智的restriction on inserts into views:
关于可插入性(可使用INSERT语句进行更新),如果可更新视图还满足视图列的这些附加要求,则可以插入可更新视图:
...
•视图必须包含基表中没有默认值的所有列。
...
note
子查询的此限制失败,导致您收到错误消息。
UPDATE
反映OP下面的注释,子查询确实包含group by和aggregate函数 - 上面引用的相同MySQL文档也说:
更具体地说,如果视图包含以下任何内容,则视图不可更新:
•聚合函数(SUM(),MIN(),MAX(),COUNT()等)
• ...
• 通过...分组
...
这意味着子查询绝对不可更新。这也意味着视图不能插入,但其他部分仍然可以更新。