对视图进行DML操作的介绍

以前只知道视图可以用来查询,最近才知道,原来视图还是可以像普通表一样进行增、删、改操作的。而我们通常用写的视图虽然仅仅只是用来进行查询,而且在建立查询视图的时候,我们从来没有考虑到将视图建立成只读格式,我意识到,事实上我们的视图是不安全的。
接下来,我将详细说明如何对视图进行数据的添加、修改和删除。
在切入主题之前,首先说明一下视图的格式定义:


 

CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW YOUR_VIEW_NAME
        (COLNAME1,COLNAME2,COLNAME3,...,COLNAMEn)
AS
        [YOUR_QUERY_STATEMENTS WILL WRITE HERE !]
        [WITH CHECK OPTION [CONSTRAINTNAME constraint_name]]
        [WITH READ ONLY] 


说明:
    首先我想说一下 FORCE 与 NOFORCE 的区别,有时候你在创建视图时可能会报一个“表或视图”不存在的错误。如果选择了 FORCE 选项,不论你的 SQL 是否有问题,只要符合语法规则,Oracle 都会按照你的意图将其创建。这样你就可以在视图建立好以后再建表,或者向表中加字段。
其次就是 WITH CHECK OPTION ,这个条件一般对于查询类视图是没有太大的用途的。但是如果你要执行DML操作,那么,这个检查将会限制你只能访问被 Where 子句所限制了的记录。更或者确切的说,如果你所执行的操作影响到视图中的一条记录不再满足视图的限制条件,那么,Oracle 就不会允许你进行该操作。这样,事实上就保证了视图中数据的完整性。
最后,也是最重要,用来保证视图安全性的 WITH READ ONLY 指令。默认情况下,Oracle中的视图如果没有申明只读,理论上都可以执行DML操作。因此,如果要保证你的视图是只读的,那就应该显式声明一下。其 实,如果业务上没有在视图上执行 DML 操作的需求的话,一般建议在建立视图时都将其声明为只读格式的,这样不但保证了视图中数据不会被非法修改,而且从一定程度上还可以提升视图的执行效率。

    说了半天的闲话,我们现在开始聊聊如何对视图执行DML操作。如果是简单视图,而且没有声明 WITH READ ONLY 那你就放心大胆的执行吧,没什么不行的,为了说明问题,我们先小试牛刀。



一:简单视图执行的 DML 操作

首先,将设库中已经有Dept这张表,我们建一个视图,命名为 V_Dept ,定义过程如下:

1>用到的表定义:


 

CREATE TABLE DEPARTMENT
(
DEPARTMENTID VARCHAR2(32 BYTE)               NOT NULL,
NAME          VARCHAR2(32 BYTE)               NOT NULL,
INNERCODE     VARCHAR2(3 BYTE)                NOT NULL,
FULLNAME      VARCHAR2(32 BYTE),
STATUS        VARCHAR2(1 BYTE)                NOT NULL,
COMMENTS      VARCHAR2(100 BYTE)
) 


2>视图定义:


CREATE OR REPLACE VIEW V_Dept
    AS SELECT * FROM DEPT 


    从定义中可以看出,事实上我们这里的定义方式跟 Oracle 视图定义的标准格式还有些出入,不过没关系,Oracle 在遇到没有定义字段名的视图时他会自动将原表中的字段名称当做视图的字段名称。执行编译,系统提示view created 。OK,我们接下来对这个简单视图进行数据的修改、增加和删除。

首先我们对视图进行一次数据查询,执行如下:


 

select * from v_dept 

返回消息>>11 rows return

OK , 首先保证我们的表中有数据(没有数据的仁兄们就得自己想办法喽^^)。然后小试牛刀让我们来执行一条插入语句:


 

Insert into v_dept
   (DEPARTMENTID, NAME, INNERCODE, FULLNAME, STATUS, COMMENTS)
Values
   ('SP13618d5cWWWWW', '后勤公司', '17', '后勤服务公司', '0', '主要用于教学场地的管理');
COMMIT; 

返回消息>>1 row inserted

OK , 说明简单视图可以执行插入语句,接下来我们再试一下修改语句,我们同样还是修改刚才插入的这条记录:


修改:update v_dept set DEPARTMENTID='SP13618d5c' where DEPARTMENTID='SP13618d5cWWWWW';
删除:delete v_dept where DEPARTMENTID='SP13618d5c'


执行上面的两条语句,我们可以看到对于简单视图我们可以像对真实表一样进行 DML 操作。那么对于复杂视图呢?

二:复杂视图在有条件的情况下执行 DML 操作。

具体的限制条件如下:
1〉不允许违反约束的 DML 操作。
2〉不能将一个值添加到包含算术表达式的列中
3〉在非 key-preserved 表上不允许 DML 操作 .
4〉在包含组函数、GROUP BY 子句、ROWNUM伪列或DISTINCT关键字的视图上不允许 DML 操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
视图是虚拟表,它的存在完全建立在对其他表的查询语句之上。视图DML操作就是对视图进行数据操作,包括插入、更新、删除等操作。下面是一些示例: 1. 创建视图 ``` CREATE VIEW my_view AS SELECT column1, column2 FROM my_table WHERE column3 = 'value'; ``` 2. 视图DML操作 插入数据: ``` INSERT INTO my_view (column1, column2) VALUES ('value1', 'value2'); ``` 更新数据: ``` UPDATE my_view SET column1 = 'new_value' WHERE column2 = 'value2'; ``` 删除数据: ``` DELETE FROM my_view WHERE column1 = 'value1'; ``` 3. 获取用户的所有表名或视图名 查询所有表: ``` SELECT table_name FROM information_schema.tables WHERE table_schema = 'your_database_name' AND table_type = 'BASE TABLE'; ``` 查询所有视图: ``` SELECT table_name FROM information_schema.tables WHERE table_schema = 'your_database_name' AND table_type = 'VIEW'; ``` 4. 视图插入数据 虽然可以通过视图插入数据,但是需要注意以下几点: - 视图必须满足以下条件之一:包含所有非空列,或者包含唯一标识列。 - 视图不能包含以下元素:GROUP BY、HAVING、DISTINCT、TOP、ORDER BY、UNION、EXCEPT 和 INTERSECT 子句。 示例: ``` CREATE TABLE my_table ( column1 INT PRIMARY KEY, column2 VARCHAR(50) NOT NULL, column3 DATE NOT NULL ); CREATE VIEW my_view AS SELECT column1, column2 FROM my_table WHERE column3 = '2022-01-01'; INSERT INTO my_view (column1, column2) VALUES (1, 'value1'); ``` 在这个示例中,我们创建了一个名为 `my_table` 的表,并添加了三个列。接下来,我们创建了一个名为 `my_view` 的视图,该视图仅显示 `my_table` 中满足 `column3 = '2022-01-01'` 的行的 `column1` 和 `column2` 列。最后,我们尝试向视图中插入数据,由于我们没有满足视图必须满足的条件,插入操作将失败。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值