更新视图是否影响基表



当我更新一个使用基表创建的视图时,更新也会影响基表。这怎么可能呢?如果视图被认为只是一个窗口,通过它我们可以看到基表的一组数据,那么当我试图改变视图内的数据时,基表如何改变呢?

您可以使用视图更改底层表的状态,只要您的目标是更改单个表。

视图是表对象之上的安全层,只要不违反基本规则,就允许大多数DML操作。

的例子:

CREATE TABLE T1(ID INT IDENTITY(1,1), [Value] NVARCHAR(50))

CREATE TABLE T2(ID INT IDENTITY(1,1), [Value] NVARCHAR(50))

——虚拟插入INSERT INTO T1 VALUES ('TestT1')

INSERT INTO T2 VALUES ('TestT2')

,
创建视图创建视图v1作为选择T1。Id等于t1 t2。Id = t2id t1。取值为T1Value, T2。值作为T2的值从T1内连接T2在T2。Id = t1。ID

——检查结果
SELECT * FROM V1

——通过视图插入是可能的,只要它只影响一个表

INSERT INTO V1 (T1Value) VALUES(TestT1_T1)

INSERT INTO V1 (T2Value) VALUES(TestT2_T2)

——只有当目标只有一个表时才可能进行更改更新V1SET T1Value = 'Changed'——**其中T2ID = 1

——这是不允许的插入到V1 (T1Value, T2Value)的值(' TestT1_T1 ', ' TestT2_T2 ')

—电话4405,16层,1州,1号线——视图或函数'V1'不可更新,因为修改会影响多个基表。

—检查每个语句的T1和T2,看看它是如何受到影响的

,

在某些数据库中,如果视图中的行与底层表中的行之间存在一对一的关系,则可以更新视图的源表,也就是说,例如,视图中不能有派生列,聚合函数或不同的子句。

在Oracle中,即使视图本身不可更新,如果定义了INSTEAD OF DML触发器,也可以允许更新。

如果你使用的是mysql,你可以阅读关于这个特性的详细描述。

"如果视图只是一个窗口,通过它我们可以看到基表的一组数据"-你从哪里得到这个定义的?

oracle对视图的定义:

视图是另一个表或表的组合的逻辑表示表。视图从它所基于的表中派生数据。这些表被称为基表。基表可能反过来是实际的表或者可能是视图本身。执行的所有操作实际上会影响视图的基表。你可以用视图的方式几乎与表相同。您可以查询、更新、插入

这种可以更新或插入的视图被亲切地命名为"可更新和可插入视图"。关于它们的Oracle文档在这里

同时,Oracle也定义了insert语句的目的:

使用INSERT语句向表(a的基表)添加行表的分区或表的子分区的对象表或基表对象视图

是的,我们可以像下面这样在视图中实现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;
/

如果视图是通过涉及单个基本关系且包含主键或候选键的简单查询定义的,则如果更改视图,则基本关系将发生更改。(但有限制)如果存在多个基本关系或分组操作,则不允许通过视图进行更新。

最新更新