2016-12-29 62 views
0

我创建了一个显示多个表中数据的视图。现在我想对视图执行数据操作操作。我怎样才能做到这一点?如何在sql视图上执行更新和删除查询?

这是我的视图

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

有没有其他办法可以达到这个目的? – SaMeEr

+0

查看只是一个'预定义的SELECT语句'。您不能在视图中进行任何更新或删除。如果你想实现数据操作操作,那么试试'存储过程'。 – Viki888

+1

@ E4c5你确定吗? – Strawberry

回答

2

在MySQL视图可以是可更新的,如果符合上Updatable and Insertable Views MySQL文档中描述的某些标准。你的观点似乎是可更新的,因为它不包含任何的以下内容:

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

• DISTINCT

•GROUP BY

•HAVING

•UNION或UNION ALL

•在选择列表中的子查询

在MySQL 5.7.11之前,select列表中的子查询失败,INSERT, 但可以更新UPDATE,DELETE。从MySQL 5.7.11开始,非依赖子查询仍为 。对于 选择列表中的从属子查询,不允许使用数据更改语句。

•某些连接(见附加在本节后面加入讨论)

•参考不可更新视图在WHERE子句在FROM子句中

•子查询是指在将表从 条款

•仅指文本值(在这种情况下,不存在下层 表更新)

•ALGORITHM =不是Temptable(使用的临时表总是让 不可更新的视图)

•基表的任何列多个引用(失败的INSERT, 好了UPDATE,DELETE)

但是,它可能不是插入的,因为fullname字段是通过表达式计算的。

要确认,如果您的视图是可更新的,用上面的文档中描述的方法:

的MySQL设置一个标志,称为视图可更新标志,在CREATE VIEW时间。如果UPDATE和DELETE(以及类似的操作)对视图合法,则标志设置为YES(真)。否则,该标志被设置为NO(假)。 INFORMATION_SCHEMA.VIEWS表中的IS_UPDATABLE列显示此标志的状态。

如果您的视图是可更新的,那么就使用它,如果它是在你删除或更新语句表:

update contact_view set fname='whatever' 

如果你的观点是不更新,那么你需要编写自己的更新和删除语句来执行修改。您如何创建它们将取决于您的确切要求。特别是对于删除操作,您可能需要考虑使用on delete cascade子句的外键来删除相关的子记录。

+0

hm,即清除了一些东西 – e4c5

+0

接受答案然后取消接受答案的任何理由? – Shadow

相关问题