我创建了一个显示多个表中数据的视图。现在我想在视图上执行数据操作操作。我怎样才能做到这一点?
这是我的观点
CREATE
ALGORITHM = UNDEFINED
DEFINER = `forge`@`%`
SQL SECURITY DEFINER
VIEW `contact_view` AS
SELECT
`c`.`id` AS `id`,
`c`.`fname` AS `fname`,
`c`.`mname` AS `mname`,
`c`.`lname` AS `lname`,
CONCAT(`c`.`fname`, ' ', `c`.`lname`) AS `fullname`,
`c`.`gender` AS `gender`,
`c`.`dob` AS `dob`,
`c`.`points` AS `points`,
`c`.`stars` AS `star`,
`c`.`inst_id` AS `inst_id`,
`c`.`ingr_id` AS `ingr_id`,
`c`.`fami_id` AS `fami_id`,
`c`.`sour_id` AS `sour_id`,
`c`.`image` AS `img`,
`c`.`address` AS `address`,
`c`.`email` AS `email`,
`c`.`doc` AS `doc`,
`cl`.`value` AS `mobile`,
`p`.`district` AS `district`,
`p`.`pincode` AS `pincode`
FROM
(((`contact` `c`
JOIN `communication_link` `cl`)
JOIN `contact_communication` `cc`)
JOIN `pincode_db` `p`)
WHERE
((`cl`.`cont_id` = `c`.`id`)
AND (`cl`.`coco_id` = 1)
AND (`c`.`pinc_id` = `p`.`id`))
答案 0 :(得分:2)
在MySQL视图中,如果它们满足Updatable and Insertable Views上MySQL文档中描述的某些条件,则可以更新。您的视图似乎是可更新的,因为它不包含以下任何内容:
聚合函数(SUM(),MIN(),MAX(),COUNT()等)
•DISTINCT
•GROUP BY
•HAVING
•UNION或UNION ALL
•选择列表中的子查询
在MySQL 5.7.11之前,选择列表中的子查询对INSERT失败, 但是对于UPDATE,DELETE是可以的。从MySQL 5.7.11开始,这仍然是 对于非依赖子查询,则为true。对于依赖的子查询 选择列表,不允许任何数据更改语句。
•某些联接(请参阅本节后面的其他联接讨论)
•引用FROM子句中的nonupdatable视图
•WHERE子句中的子查询引用FROM中的表 条款
•仅指文字值(在这种情况下,没有底层证据) 表要更新)
•ALGORITHM = TEMPTABLE(临时表的使用总是会产生一个视图 nonupdatable)
•对基表的任何列的多次引用(INSERT失败, 好的,更新,删除)
但是,它可能不可插入,因为fullname
字段是由表达式计算的。
要确认您的视图是否可更新,请使用上述文档中描述的方法:
MySQL在CREATE VIEW时设置一个标志,称为视图可更新性标志。如果UPDATE和DELETE(以及类似操作)对于视图是合法的,则该标志设置为YES(true)。否则,该标志设置为NO(false)。 INFORMATION_SCHEMA.VIEWS表中的IS_UPDATABLE列显示此标志的状态。
如果您的视图是可更新的,那么只需使用它就像它是删除或更新语句中的表一样:
update contact_view set fname='whatever'
如果您的视图不可更新,那么您需要编写自己的更新和删除语句来执行修改。您如何创建它们将取决于您的确切要求。特别是对于删除操作,您可能需要考虑使用带有on delete cascade
子句的外键来删除相关的子记录。