查看与众不同的限制?

时间:2019-10-29 19:06:36

标签: oracle view distinct

我发现以下信息:我们无法从视图中删除查询中有区别的行,但我想显示示例:

create table tb001 ( id number );
insert into tb001 values (1); 
insert into tb001 values (2);

create table tb002 ( id number );
insert into tb002 values (1); 
insert into tb002 values (2);
insert into tb002 values (2);

create view vw_tb001 as select distinct(id) from tb001;
create view vw_tb002 as select distinct(id) from tb002;

所以在第一个版本中,我们可以从视图vw_tb001中删除,因为我们没有重复的行
在第二个版本中,我们无法从视图vw_tb002中删除。
因此,我对限制感到困惑吗?需要专家的帮助。

2 个答案:

答案 0 :(得分:0)

通过在表上运行独特操作创建的任何视图都应阻止您从视图中删除。使用上面的示例,即使tb001中没有重复项,我也不同意您可以从vw_tb001中删除。

答案 1 :(得分:0)

从技术上讲,您仍然可以从这种视图中删除行。就是这样。

首先测试用例:

SQL> drop table tb002;

Table dropped.

SQL> create table tb002 ( id number );

Table created.

SQL> insert into tb002 values (1);

1 row created.

SQL> insert into tb002 values (2);

1 row created.

SQL> insert into tb002 values (2);

1 row created.

SQL> create view vw_tb002 as select distinct(id) from tb002;

View created.

SQL>

关键字:代替触发器;我将创建一个“替换”删除功能。插入或更新也可以这样做。基本上,它告诉Oracle从视图中删除时该怎么做,所以-“代替”从视图中删除行,而是从其基础表中删除行:

SQL> create or replace trigger trg_iof_vw
  2    instead of delete on vw_tb002
  3    for each row
  4  begin
  5    delete from tb002 where id = :old.id;
  6  end;
  7  /

Trigger created.

SQL>

让我们看看它是如何工作的:

开头的内容:

SQL> select * from tb002;

        ID
----------
         1
         2
         2

SQL> select * from vw_tb002;

        ID
----------
         1
         2

删除:

SQL> delete from vw_tb002 where id = 2;

1 row deleted.

结果:

SQL> select * From tb002;

        ID
----------
         1

SQL> select * from vw_tb002;

        ID
----------
         1

SQL>