데이터 베이스 MySQL 튜토리얼 允许进行DML操作的视图条件

允许进行DML操作的视图条件

Jun 07, 2016 pm 03:56 PM
dml 할 수 있다 방패 작동하다 상태 보다 지휘하다

视图可以屏蔽某些基表的信息,或是join多个基表组成一个复杂查询,视图本身也是可以进行DML操作,但受一些条件的限制。 首先我们看下官方文档对视图进行DML操作的要求说明: The following notes apply to updatable views: An updatable view is one you ca

视图可以屏蔽某些基表的信息,或是join多个基表组成一个复杂查询,视图本身也是可以进行DML操作,但受一些条件的限制。

首先我们看下官方文档对视图进行DML操作的要求说明:

The following notes apply to updatable views:

An updatable view is one you can use to insert, update, or delete base table rows. You can create a view to be inherently updatable, or you can create an INSTEAD OF trigger on any view to make it updatable.

这里说明了两种可updateable(包括增删改基表)视图的方法:一是继承基表的视图,二是使用INSTEAD OF的触发器来实现任意视图的updatable。

To learn whether and in what ways the columns of an inherently updatable view can be modified, query the USER_UPDATABLE_COLUMNS data dictionary view. The information displayed by this view is meaningful only for inherently updatable views.

USER_UPDATABLE_COLUMNS数据字典视图可以找到视图的哪些字段可以进行增加、更新和删除。

For a view to be inherently updatable, the following conditions must be met:

对于这种updatable继承的视图,需要满足以下条件:

1. Each column in the view must map to a column of a single table. For example, if a view column maps to the output of a TABLE clause (an unnested collection), then the view is not inherently updatable.

2. The view must not contain any of the following constructs:

A set operator

A DISTINCT operator

An aggregate or analytic function

A GROUP BY, ORDER BY, MODEL, CONNECT BY, or START WITH clause

A collection expression in a SELECT list

A subquery in a SELECT list

A subquery designated WITH READ ONLY

Joins, with some exceptions, as documented in Oracle Database Administrator's Guide

3. In addition, if an inherently updatable view contains pseudocolumns or expressions, then you cannot update base table rows with an UPDATE statement that refers to any of these pseudocolumns or expressions.

4. If you want a join view to be updatable, then all of the following conditions must be true:

对于一个join视图,如果需要可updatable,那么就需要满足如下条件:

(1) The DML statement must affect only one table underlying the join.

DML必须仅影响一个join连接的表。

(2) For an INSERT statement, the view must not be created WITH CHECK OPTION, and all columns into which values are inserted must come from a key-preserved table. A key-preserved table is one for which every primary key or unique key value in the base table is also unique in the join view.

INSERT语句,不能使用WITH CHECK OPTION,并且所有待插入的列都来自于key-preserved表。

key-preserved表是指基表中每个主键或唯一键也必须是在join视图中唯一。

(3) For an UPDATE statement, the view must not be created WITH CHECK OPTION, and all columns updated must be extracted from a key-preserved table.

UPDATE语句,视图不能使用WITH CHECK OPTION创建,同样更新字段也必须来自于key-preserved表。

5. For a DELETE statement, if the join results in more than one key-preserved table, then Oracle Database deletes from the first table named in the FROM clause, whether or not the view was created WITH CHECK OPTION.

DELETE语句,如果join结果有多个key-preserved表,Oracle只会删除FROM子句中第一个表的记录,不管视图是否使用WITH CHECK OPTION。

下面通过一系列实验来说明。

创建测试表:

create table dept(deptid int primary key, deptname varchar2(20));

create table employee(empid int primary key, empname varchar2(20), deptid int);

创建测试数据:

insert into dept values(1,'dept1');

insert into dept values(2,'dept2');

insert into dept values(3,'dept3');

insert into employee values(1,'emp1',1);

insert into employee values(2,'emp2',1);

insert into employee values(3,'emp3',2);

创建视图:

create view testv

as select d.deptid deptid, deptname, empid, empname, e.deptid edeptid

from dept d join employee e

on d.deptid = e.deptid;

SQL> select * from testv;
DEPTID DEPTNAME EMPID EMPNAME EDEPTID
---------- -------------------- ---------- -------------------- ----------
1 dept1 1 emp1 1
1 dept1 2 emp2 1
2 dept2 3 emp3 2

仅employee表是key-preserved表。

测试1:对key-preserved表字段进行增加、更新的操作

update testv set empname='empx' where edeptid=1;

update testv set empname='empx' where empid=1;

update testv set empname='empx' where deptid=1;

insert into testv(empid,empname,edeptid) values(4,'emp4',2);

以上SQL可以执行,因为修改或添加的字段都是employee的,即key-preserved表。

测试2:验证上述“DELETE语句,如果join结果有多个key-preserved表,Oracle只会删除FROM子句中第一个表的记录,不管视图是否使用WITH CHECK OPTION”

create view testv

as select d.deptid deptid, deptname, empid, empname, e.deptid edeptid

from employee e join dept d

on d.deptid = e.deptid;

create view testv

as select d.deptid deptid, deptname, empid, empname, e.deptid edeptid

from employee e join dept d

on d.deptid = e.deptid

WITH CHECK OPTION;

select * from testv;
DEPTID DEPTNAME EMPID EMPNAME EDEPTID
---------- -------------------- ---------- -------------------- ----------
1 dept1 1 emp1 1
1 dept1 2 emp2 1
2 dept2 3 emp3 2

delete from testv where deptid = 1;
2 rows deleted.

select * from dept;
DEPTID DEPTNAME
---------- --------------------
1 dept1
2 dept2
3 dept3

select * from employee;
EMPID EMPNAME DEPTID
---------- -------------------- ----------
3 emp3 2

delete from testv where empid = 1;
1 row deleted.


select * from testv;
DEPTID DEPTNAME EMPID EMPNAME EDEPTID
---------- -------------------- ---------- -------------------- ----------
1 dept1 2 emp2 1
2 dept2 3 emp3 2

select * from dept;
DEPTID DEPTNAME
---------- --------------------
1 dept1
2 dept2
3 dept3

select * from employee;
EMPID EMPNAME DEPTID
---------- -------------------- ----------
2 emp2 1
3 emp3 2

测试3:对于INSERT和UPDATE语句,不能使用WITH CHECK OPTION创建视图

create view test1v
as select t1id ,t1v,t2id,t2v
from test1 join test2
on test1.t1id=test2.t2id
with check option;

insert into test1v(t1id,t1v) values(4,'t4');
*
ERROR at line 1:
ORA-01733: virtual column not allowed here

update test1v set t1id=4 where t1id=1;
*
ERROR at line 1:
ORA-01733: virtual column not allowed here

测试4:非key-preserved表字段不能更新或插入

update testv set deptname='deptx' where deptid=1
update testv set deptname='deptx' where empid=1
insert into testv(deptid,deptname) values(4,'dept4')
ORA-01779: cannot modify a column which maps to a non key-preserved table

测试5:查看视图中哪些字段可以增删改

select * from USER_UPDATABLE_COLUMNS where table_name='TESTV';
OWNER TABLE_NAME COLUMN_NAME UPD INS DEL
-------------------------------------------------------------------------------------------
DCSOPEN TESTV DEPTID NO NO NO
DCSOPEN TESTV DEPTNAME NO NO NO
DCSOPEN TESTV EMPID YES YES YES
DCSOPEN TESTV EMPNAME YES YES YES
DCSOPEN TESTV EDEPTID YES YES YES

If you want a join view to be updatable, then all of the following conditions must be true:
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

iPhone에서 문자 메시지 차단을 설정하는 방법 iPhone에서 문자 메시지 차단을 설정하는 방법 Feb 24, 2024 pm 01:48 PM

스마트폰의 대중화로 인해 우리는 매일 엄청난 양의 문자 메시지를 받고 있는데, 그 중 일부는 광고, 판촉 메시지, 일부는 스팸 문자 메시지로 시간을 낭비할 뿐만 아니라 공간을 점유하고 있습니다. 우리 휴대폰의. 그러나 다행히도 iPhone은 이러한 성가신 문자 메시지를 차단하는 몇 가지 기능을 제공합니다. 이번 글에서는 iPhone을 이용하여 문자 메시지를 차단하는 방법을 소개합니다. 문자 메시지를 차단하려면 먼저 설정 앱을 연 다음 스크롤하여 메시지를 탭하세요. 정보 설정 인터페이스에서 '차단됨'을 포함한 일부 옵션을 볼 수 있습니다.

PyCharm 사용 튜토리얼: 작업 실행에 대해 자세히 안내합니다. PyCharm 사용 튜토리얼: 작업 실행에 대해 자세히 안내합니다. Feb 26, 2024 pm 05:51 PM

PyCharm은 매우 인기 있는 Python 통합 개발 환경(IDE)으로 Python 개발을 더욱 효율적이고 편리하게 만들어주는 다양한 기능과 도구를 제공합니다. 이 기사에서는 PyCharm의 기본 작동 방법을 소개하고 독자가 도구 작동을 빠르게 시작하고 능숙하게 사용할 수 있도록 구체적인 코드 예제를 제공합니다. 1. PyCharm 다운로드 및 설치 먼저 PyCharm 공식 웹사이트(https://www.jetbrains.com/pyc)로 이동해야 합니다.

sudo란 무엇이며 왜 중요한가요? sudo란 무엇이며 왜 중요한가요? Feb 21, 2024 pm 07:01 PM

sudo(수퍼유저 실행)는 일반 사용자가 루트 권한으로 특정 명령을 실행할 수 있도록 하는 Linux 및 Unix 시스템의 핵심 명령입니다. sudo의 기능은 주로 다음 측면에 반영됩니다. 권한 제어 제공: sudo는 사용자에게 일시적으로 수퍼유저 권한을 얻을 수 있는 권한을 부여하여 시스템 리소스와 민감한 작업을 엄격하게 제어합니다. 일반 사용자는 필요할 때만 sudo를 통해 임시 권한을 얻을 수 있으며, 항상 슈퍼유저로 로그인할 필요는 없습니다. 향상된 보안: sudo를 사용하면 일상적인 작업 중에 루트 계정을 사용하지 않아도 됩니다. 모든 작업에 루트 계정을 사용하면 올바르지 않거나 부주의한 작업에는 전체 권한이 부여되므로 예기치 않은 시스템 손상이 발생할 수 있습니다. 그리고

WeChat Moments에서 광고 푸시를 차단하는 방법 WeChat Moments에서 광고를 끄는 방법 WeChat Moments에서 광고 푸시를 차단하는 방법 WeChat Moments에서 광고를 끄는 방법 Mar 12, 2024 pm 01:50 PM

우리는 매일 WeChat 앱을 사용해야 합니다. 여기에 있는 기능은 모두가 여기에서 채팅할 수 있을 뿐만 아니라 삶의 다양한 문제를 잘 해결할 수 있도록 해줍니다. 요즘에는 모두가 여전히 친구 서클을 확인하는 것을 좋아합니다. 친구 서클에 게시된 생활 업데이트가 있고 멋진 삶을 기록하고 공개 여부를 설정할 수 있습니다. 모멘트의 범위는 지정된 시간 내에 볼 수 있습니다. 모멘트를 확인할 때마다 모든 사람이 광고 푸시 인터페이스에 매우 짜증을 내고 이를 닫고 싶어한다는 것을 알게 될 것입니다. .

Tantan의 모바일 주소록에서 친구를 차단하는 방법은 무엇입니까? 모바일 연락처를 차단하는 단계는 무엇입니까? Tantan의 모바일 주소록에서 친구를 차단하는 방법은 무엇입니까? 모바일 연락처를 차단하는 단계는 무엇입니까? Mar 12, 2024 pm 03:55 PM

우리 모두는 특히 Tantan 소셜 플랫폼을 좋아합니다. 이곳에서는 모두가 인터넷에서 친구를 사귈 수 있습니다. 모두가 성공적으로 매칭되면 우리는 반드시 서로를 좋아하는 사용자와 매칭될 것입니다. 여기에서는 안전하게 소셜 채팅을 할 수 있습니다. 매일 채팅을 하면 모든 사람이 더 가까워지고 더 가까워질 수 있으며, 많은 친구들이 이 소셜 네트워크를 사용하고 있을 때 귀하의 모바일 주소에 일부 친구나 친구가 포함되는 것을 원하지 않을 것입니다. 당황스러운 상황을 피하기 위해 여기의 방법을 사용하여 연락처를 차단할 수 있으며 연락처를 차단하는 방법을 알고 있다면 편집자가 제공하는 튜토리얼을 읽을 수 있습니다.

Linux Deploy 작업 단계 및 주의사항 Linux Deploy 작업 단계 및 주의사항 Mar 14, 2024 pm 03:03 PM

LinuxDeploy 작업 단계 및 주의 사항 LinuxDeploy는 사용자가 Android 장치에 다양한 Linux 배포판을 신속하게 배포하여 모바일 장치에서 완전한 Linux 시스템을 경험할 수 있도록 도와주는 강력한 도구입니다. 이 기사에서는 LinuxDeploy의 작동 단계와 주의 사항을 자세히 소개하고 독자가 이 도구를 더 잘 사용할 수 있도록 구체적인 코드 예제를 제공합니다. 작업 단계: Linux 설치배포: 먼저 설치

회사가 Zhaopin Recruitment에서 내 이력서를 보는 것을 차단하려면 어떻게 해야 합니까? 회사가 귀하의 이력서를 보지 못하도록 차단하는 Zhaopin 채용 튜토리얼! 회사가 Zhaopin Recruitment에서 내 이력서를 보는 것을 차단하려면 어떻게 해야 합니까? 회사가 귀하의 이력서를 보지 못하도록 차단하는 Zhaopin 채용 튜토리얼! Mar 15, 2024 pm 04:04 PM

1. Zhaopin Recruitment에서는 회사가 내 이력서를 보는 것을 어떻게 차단할 수 있나요? 회사가 귀하의 이력서를 보지 못하도록 차단하는 Zhaopin 채용 튜토리얼! 1. 다운로드한 Zhaopin Recruitment 앱을 열고 계정에 로그인한 후 메인 페이지로 들어갑니다. 2. 메인페이지 접속 후, 마이페이지 클릭 후 온라인 이력서를 선택하세요. 3. 이력서 인터페이스에 도달한 후 오른쪽 상단 모서리를 클릭하고 개인 정보 설정 옵션을 엽니다. 4. 개인 정보 보호 인터페이스에 들어간 후 Block Company를 클릭합니다. 5. 차단 추가 인터페이스에서 차단하려는 회사 이름을 입력하세요. 6. 최종 선택 후 아래 차단 버튼을 클릭하시면 해당 설정이 완료되어 귀하의 이력서를 보실 수 없습니다.

win10 부팅 암호를 얻기 위해 F2 키를 누르는 것을 잊은 경우 수행할 작업 win10 부팅 암호를 얻기 위해 F2 키를 누르는 것을 잊은 경우 수행할 작업 Feb 28, 2024 am 08:31 AM

아마도 많은 사용자들이 집에 사용하지 않는 컴퓨터가 여러 대 있고, 오랫동안 사용하지 않았기 때문에 시동 암호를 완전히 잊어버렸기 때문에 암호를 잊어버린 경우 어떻게 해야 하는지 알고 싶습니까? 그럼 함께 살펴볼까요? win10 부팅 암호를 입력하는 데 F2 키를 잊어버린 경우 어떻게 해야 합니까? 1. 컴퓨터의 전원 버튼을 누른 다음 컴퓨터를 켤 때 F2 키를 누릅니다(컴퓨터 브랜드마다 BIOS에 들어가는 버튼이 다릅니다). 2. BIOS 인터페이스에서 보안 옵션을 찾으세요(컴퓨터 브랜드에 따라 위치가 다를 수 있음). 일반적으로 상단의 설정 메뉴에 있습니다. 3. 그런 다음 SupervisorPassword 옵션을 찾아 클릭합니다. 4. 이때 사용자는 자신의 비밀번호를 볼 수 있으며 동시에 옆에 있는 활성화를 찾아 Dis로 전환합니다.

See all articles