当我更新使用基表创建的视图时,更新也会影响基表。怎么可能?如果视图被视为一个“窗口”,通过它我们可以看到基表的一组数据,那么当我尝试更改视图中的数据时,基表如何改变。
答案 0 :(得分:1)
在某些数据库中,如果视图中的行与基础表中的行之间存在一对一的关系,则可以更新视图的源表,也就是说,您无法导出例如,视图中的列,聚合函数或不同的子句。
在Oracle中,即使视图本身不可更新,如果定义了INSTEAD OF DML trigger,也可以允许更新。
如果您使用mysql,则可以阅读有关此功能的详细说明Updatable and insertable views。
答案 1 :(得分:1)
只要您在单个表中定位更改,就可以使用视图更改基础表的状态。
View是一个位于表对象顶部的安全层,只要你没有泛化基本规则,它就允许大部分DML操作。
示例:
创建表T1 (ID INT IDENTITY(1,1),[Value] NVARCHAR(50))
创建表T2 (ID INT IDENTITY(1,1),[Value] NVARCHAR(50))
- 虚拟插入 插入T1值(' TestT1')
插入T2值(' TestT2')
- 创建视图
创建视图V1
如
SELECT T1.ID AS T1ID,T2.ID AS T2ID,T1.Value AS T1Value,T2.Value AS T2Value from T1 INNER JOIN T2
ON T2.ID = T1.ID
- 检查结果
SELECT * FROM V1
- 只要只影响一个表
,就可以通过视图进行插入插入V1(T1值)值 (' TestT1_T1&#39)
INSERT INTO V1(T2Value)值 (' TestT2_T2&#39)
- 仅当目标只有一个表时才可以进行更改 更新V1 SET T1Value ='已更改' - ** 在哪里T2ID = 1
- 这是不允许的 INSERT INTO V1(T1Value,T2Value)值 (' TestT1_T1'' TestT2_T2&#39)
- Msg 4405,Level 16,State 1,Line 1 - 查看或功能' V1'不可更新,因为修改会影响多个基表。
- 使用每个语句检查T1和T2以查看它是如何受到影响的
-
答案 2 :(得分:0)
“如果视图被视为一个'窗口',通过它我们可以看到基表的一组数据” - 你从哪里得到这个定义?
oracle对观点的评价是什么:
视图是另一个表或其组合的逻辑表示 表。视图从其所基于的表中获取其数据。 这些表称为基表。基表可能反过来 实际表或可能是视图本身。执行所有操作 在视图上实际上会影响视图的基表。您可以使用 视图几乎与表格相同。您可以查询,更新,插入 进入和删除视图,就像标准表一样。
您可以更新或插入的视图被称为“可更新和可插入视图”。有关它们的Oracle文档是here。
此外,这是Oracle定义“insert”语句的目的:
使用INSERT语句向表中添加行,即a的基表 view,分区表的分区或a的子分区 复合分区表,或对象表或基表 对象视图。
答案 3 :(得分:0)
是的,我们可以在下面的视图中实现DML操作:
Create or replace view emp_dept_join as Select d.department_id,
d.department_name, e.first_name, e.last_name from employees
e, departments d where e.department_id = d.department_id;
SQL>CREATE OR REPLACE TRIGGER insert_emp_dept
INSTEAD OF INSERT ON emp_dept_join DECLARE v_department_id departments.department_id%TYPE;
BEGIN
BEGIN
SELECT department_id INTO v_department_id
FROM departments
WHERE department_id = :new.department_id;
EXCEPTION
WHEN NO_DATA_FOUND THEN
INSERT INTO departments (department_id, department_name)
VALUES (dept_sequence.nextval, :new.department_name)
RETURNING ID INTO v_department_id;
END;
INSERT INTO employees (employee_id, first_name, last_name, department_id)
VALUES(emp_sequence.nextval, :new.first_name, :new.last_name, v_department_id);
END insert_emp_dept;
/
答案 4 :(得分:0)
如果viwe是通过涉及单个基本关系的简单查询定义的,并且包含主键或候选键,那么如果更改视图,基本关系将会发生变化。 (但有限制) 如果存在多个基本关系或分组操作,则不允许通过视图进行更新。