更新视图会影响基表吗?

时间:2014-05-13 03:41:24

标签: oracle view

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

5 个答案:

答案 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是通过涉及单个基本关系的简单查询定义的,并且包含主键或候选键,那么如果更改视图,基本关系将会发生变化。 (但有限制) 如果存在多个基本关系或分组操作,则不允许通过视图进行更新。