Oracle 更新视图是否会影响基表?
当我更新使用基表创建的视图时,更新也会影响基表。这怎么可能?如果视图仅被视为一个“窗口”,通过它我们可以看到基表的一组数据,那么当我尝试更改视图中的数据时,基表如何更改。在某些数据库中,可以更新源表对于视图,如果视图中的行与基础表中的行之间存在一对一关系,例如,视图中不能有派生列、聚合函数或distinct子句 在Oracle中,即使视图本身不可更新,如果定义了,也可能允许更新Oracle 更新视图是否会影响基表?,oracle,view,Oracle,View,当我更新使用基表创建的视图时,更新也会影响基表。这怎么可能?如果视图仅被视为一个“窗口”,通过它我们可以看到基表的一组数据,那么当我尝试更改视图中的数据时,基表如何更改。在某些数据库中,可以更新源表对于视图,如果视图中的行与基础表中的行之间存在一对一关系,例如,视图中不能有派生列、聚合函数或distinct子句 在Oracle中,即使视图本身不可更新,如果定义了,也可能允许更新 如果您使用mysql,您可以阅读有关此功能的详细说明。您可以使用该视图更改基础表的状态,只要您的目标是单个表中的更改
如果您使用mysql,您可以阅读有关此功能的详细说明。您可以使用该视图更改基础表的状态,只要您的目标是单个表中的更改 视图是表对象顶部的一个安全层,只要您不遵守基本规则,它就允许大多数DML操作 例如: 创建表T1 (ID-INT-IDENTITY(1,1),[Value]NVARCHAR(50)) 创建表T2 (ID-INT-IDENTITY(1,1),[Value]NVARCHAR(50)) --虚拟插入 插入到T1值中('TestT1') 插入T2值('TestT2') --创建视图
创建视图V1 作为 从T1内部联接T2中选择T1.ID作为T1ID,T2.ID作为T2ID,T1.Value作为T1Value,T2.Value作为T2Value 在T2.ID=T1.ID上 --检查结果
从V1中选择* --只要Insert只影响一个表,就可以通过view进行插入 插入到V1(T1Value)值中 ('TestT1_T1') 插入到V1(T2Value)值中 ('TestT2_T2') --仅当目标仅为一个表时,才可能进行更改 更新V1 SET T1Value='Changed'--** 其中T2ID=1 --这是不允许的 插入到V1(T1Value,T2Value)值中 ('TestT1_T1','TestT2_T2') --Msg 4405,16级,状态1,第1行 --视图或函数“V1”不可更新,因为修改会影响多个基表 --用每个语句检查T1和T2,看看它是如何受到影响的 --“如果视图被视为一个“窗口”,通过它我们可以看到基表的一组数据” -你从哪里得到这个定义的 oracle对视图的看法: 视图是另一个表或其组合的逻辑表示 桌子。视图从其所基于的表中派生数据。 这些表称为基表。基表可能依次是 实际的表或视图本身可能是。执行的所有操作 在视图上,实际上会影响视图的基表。你可以用 视图的方式与表几乎相同。您可以查询、更新、插入 在视图中插入和删除,就像在标准表中一样 这种可以更新或插入的视图被亲切地命名为“可更新和可插入视图”。关于它们的Oracle文档是 此外,Oracle是如何定义“insert”语句的目的的: 使用INSERT语句将行添加到表中,表是 视图,已分区表的分区或 复合分区表,或对象表或 对象视图
是的,我们可以在如下视图中实现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;
/
如果viwe是通过涉及单个基关系的简单查询定义的,并且包含主键或候选键,那么如果更改视图,则基关系将发生更改。(但有限制) 如果存在多个基本关系或分组操作,则不允许通过视图进行更新