如何在sql视图上执行更新和删除查询?

时间:2016-12-29 09:08:50

标签: mysql sql laravel-5 mariadb

我创建了一个显示多个表中数据的视图。现在我想在视图上执行数据操作操作。我怎样才能做到这一点?

这是我的观点

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`))

1 个答案:

答案 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子句的外键来删除相关的子记录。