【问题标题】:How to execute update and delete query on sql view?如何在 sql 视图上执行更新和删除查询?
【发布时间】:2017-05-13 14:01:59
【问题描述】:

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

这是我的看法

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

【问题讨论】:

  • 还有其他方法可以实现吗?
  • View 只是一个pre-defined SELECT statement。您不能在视图中进行任何更新或删除。如果你想实现数据操作操作,那就试试stored procedure
  • @E4c5 你确定吗?
  • 好吧@Strawberry,你是对的,在某些情况下你可以插入或更新到多个表视图!你每天都会学到一些东西:)
  • 准备好在不久的将来处理极其复杂的数据清理

标签: mysql sql laravel-5 mariadb


【解决方案1】:

在 MySQL 中,如果视图满足Updatable and Insertable Views 上的 MySQL 文档中描述的某些条件,则可以更新它们。您的视图似乎是可更新的,因为它不包含以下任何内容:

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

• 不同

• 分组方式

• 拥有

• UNION 或 UNION ALL

• 选择列表中的子查询

在 MySQL 5.7.11 之前,选择列表中的子查询对于 INSERT 失败, 但可以更新、删除。从 MySQL 5.7.11 开始,这仍然是 对于非依赖子查询为真。对于依赖子查询 选择列表,不允许数据更改语句。

• 某些联接(请参阅本节后面的其他联接讨论)

• FROM 子句中对不可更新视图的引用

• WHERE 子句中的子查询引用 FROM 中的表 子句

• 仅指文字值(在这种情况下,没有基础 要更新的表)

• ALGORITHM = TEMPTABLE(使用临时表总是生成视图 不可更新)

• 多次引用基表的任何列(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 子句的外键来删除相关的子记录。

【讨论】:

  • 有什么理由接受答案然后不接受?
猜你喜欢
  • 2019-07-16
  • 2014-11-07
  • 2012-09-01
  • 2013-04-18
  • 1970-01-01
  • 2014-09-23
  • 2012-07-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多