能否向Mysql视图中插入/更新/删除数据

原文链接:http://blog.sina.com.cn/s/blog_8edc37a80101c4ba.html

要通过视图更新基本表数据,必须保证视图是可更新视图,即可以在INSET、UPDATE或DELETE等语句当中使用它们。对于可更新的视图,在视图中的行和基表中的行之间必须具有一对一的关系。还有一些特定的其他结构,这类结构会使得视图不可更新。
 
如果视图包含下述结构中的任何一种,那么它就是不可更新的:
(1)聚合函数;
 
(2)DISTINCT关键字;
 
(3)GROUP BY子句;
 
(4)ORDER BY子句;
 
(5)HAVING子句;
 
(6)UNION运算符;
 
(7)位于选择列表中的子查询;
 
(8)FROM子句中包含多个表;
 
(9)SELECT语句中引用了不可更新视图;
 
(10)WHERE子句中的子查询,引用FROM子句中的表;
 
(11)ALGORITHM 选项指定为TEMPTABLE(使用临时表总会使视图成为不可更新的)。
 
1、插入数据
 
使用INSERT语句通过视图向基本表插入数据
 
例: 创建视图CS_XS,视图中包含计算机专业的学生信息,并向CS_XS视图中插入一条记录:('081255','李牧','计算机',1,'1990-10-21',50,NULL,NULL)。
 
首先创建视图CS_XS:(以下的删除、修改都是用该表)
 
CREATEOR REPLACE VIEW CS_XS
  www.2cto.com  
      AS  SELECT* FROM XS
 
      WHERE 专业名 = '计算机'  WITH CHECK OPTION;
 
注意:在创建视图的时候加上WITH CHECK OPTION子句,是因为WITH CHECK OPTION子句会在更新数据的时候检查新数据是否符合视图定义中WHERE子句的条件。WITH CHECKOPTION子句只能和可更新视图一起使用。
 
接下来插入记录:
 
INSERTINTO CS_XS
 
     VALUES('081255', '李牧', '计算机', 1, '1990-10-14',50, NULL, NULL);
 
注意:这里插入记录时专业名只能为“计算机”。
 
这时,使用SELECT语句查询CS_XS视图和基本表XS,就可发现XS表中该记录已经被添加。
 
当视图所依赖的基本表有多个时,不能向该视图插入数据,因为这将会影响多个基本表。例如,不能向视图CS_KC插入数据,因为CS_KC依赖两个基本表:XS和XS_KC。
 
对INSERT语句还有一个限制:SELECT语句中必须包含FROM子句中指定表的所有不能为空的列。例如,若CS_XS视图定义的时候不加上“姓名”字段,则插入数据的时候会出错。

2、修改数据
 
使用UPDATE语句可以通过视图修改基本表的数据
 
例: 将CS_XS视图中所有学生的总学分增加8。
 
UPDATECS_XS SET 总学分 = 总学分+ 8;
 
该语句实际上是将CS_XS视图所依赖的基本表XS中所有记录的总学分字段值在原来基础上增加8。
 
若一个视图依赖于多个基本表,则一次修改该视图只能变动一个基本表的数据。
 
例: 将CS_KC视图中学号为081101的学生的101课程成绩改为90。
 
UPDATECS_KC  SET 成绩=90
 
    WHERE 学号='081101' AND 课程号='101';
 
本例中,视图CS_KC依赖于两个基本表:XS和XS_KC,对CS_KC视图的一次修改只能改变学号(源于XS表)或者课程号和成绩(源于XS_KC表)。
 
以下的修改是错误的:
 
UPDATECS_KC  SET 学号='081120',课程号='208' WHERE 成绩=90;
 
3、删除数据
 
使用DELETE语句可以通过视图删除基本表的数据
 
例: 删除CS_XS中女同学的记录。
 
DELETEFROM CS_XS  WHERE 性别 = 0;
 
注意:对依赖于多个基本表的视图,不能使用DELETE语句。例如,不能通过对CS_KC视图执行DELETE语句而删除与之相关的基本表XS及XS_KC表的数据。



### MySQL 中向视图插入数据的语法和使用MySQL 中,`INSERT INTO VIEW` 的操作并非总是可行。这是因为视图本质上是一个基于查询的结果集,并不直接对应于实际存储的数据表。只有当视图满足某些条件,才能执行 `INSERT` 或其他修改操作。 #### 条件支持 为了能够通过视图插入数据,该视图必须满足以下条件之一[^1]: - 视图必须是可更新的(updatable)。这意味着它不能包含聚合函数(如 `SUM()`、`COUNT()`)、子查询、连接(JOIN)、分组(GROUP BY)或其他复杂表达式。 - 如果视图是从单个基础表派生而来的简单 SELECT 查询,则可以对其进行插入删除更新操作。 #### 插入数据视图的语法 如果视图允许插入操作,其基本语法如下所示: ```sql INSERT INTO view_name (column_list) VALUES (value_list); ``` 这里需要注意的是,`view_name` 是目标视图名称,`column_list` 表示要插入的目标列名列表,而 `value_list` 则表示对应的值列表。 #### 示例 假设存在一张名为 `employees` 的表以及一个简单的视图 `employee_view`: ```sql CREATE TABLE employees ( id INT PRIMARY KEY, name VARCHAR(50), salary DECIMAL(10, 2) ); -- 创建视图 employee_view CREATE VIEW employee_view AS SELECT id, name FROM employees; ``` 在这种情况下,可以通过下面的方式向视图插入新记录: ```sql INSERT INTO employee_view (id, name) VALUES (1, 'John Doe'); ``` 这条语句实际上会将一条新的员工记录插入到原始的 `employees` 表中,但仅限于那些被视图所展示出来的字段。 然而,尝试插入涉及未映射至视图中的列(比如这里的 `salary`),则会导致错误发生,因为这些额外的信息无法传递给底层的真实表格结构[^3]。 #### 错误处理 如果试违反上述规则或者针对不可更新类型的视图实施写入动作,将会收到类似于这样的错误消息:“Error Code: 1288. The target table xxx of the INSERT is not updatable”。此应该重新审视自己的设计逻辑,考虑是否需要调整视图定义或是采用其它方法来完成业务需求[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值