哪类视图是可以更新的?哪类视图是不可更新的?各举一例说明。
时间: 2024-11-30 16:16:19 浏览: 3
Android安卓应用源码-视图效果类源代码(10例).zip
在数据库中,视图分为两种类型:更新视图(Updatable View)和只读视图(Non-Updateable View),它们对于数据更新的支持程度不同。
**可更新视图(Updatable View)**:
这类视图允许对其内容进行增删改操作,前提是满足以下条件:
1. 视图的定义只包含了简单的选择(SELECT)、投影(GROUP BY)、聚合函数(如SUM、COUNT等)及连接(JOIN)操作,且未包含子查询。
2. 视图的基础表是单表,即视图是从一个基本表派生出的,而非由其他视图组合而来。
3. 没有隐式或显式的WHERE子句阻止了所有记录的更新。
例子:假设有一个员工表(Employee),我们创建了一个视图,显示每个部门的总薪水,这个视图是可以更新的,因为我们可以添加或减少某个部门的薪水。
```sql
CREATE VIEW DepartmentSalaries AS
SELECT Department, SUM(Salary) AS TotalSalary
FROM Employee
GROUP BY Department;
```
在这个视图上进行的更新操作,比如增加某部门的工资,通常会基于原基础表的实际数据进行。
**不可更新视图(Non-Updateable View)**:
这类视图通常包括以下情况:
1. 视图定义包含聚合函数、GROUP BY、HAVING、ORDER BY或子查询,这可能会导致更新的不确定性。
2. 视图是从多张表派生出来的,涉及到笛卡尔积,这样的视图无法确定更新哪一行。
3. 使用了WITH CHECK OPTION或者ROWGUIDCOL属性,阻止了未经授权的更新。
例子:如果视图是基于多张表的连接,如一个视图显示员工的所有订单及其总计金额,就不能直接更新,因为不清楚应如何同步基础表的变更。
```sql
CREATE VIEW EmployeeOrders AS
SELECT E.*, O.TotalAmount
FROM Employees E
JOIN Orders O ON E.EmployeeID = O.EmployeeID
```
在这样的视图上尝试更新,系统将报错,不允许直接修改数据。
阅读全文