Oracle數(shù)據(jù)庫入門之DDL與數(shù)據(jù)庫對(duì)象
來源:易賢網(wǎng) 閱讀:1117 次 日期:2014-09-17 10:32:35
溫馨提示:易賢網(wǎng)小編為您整理了“Oracle數(shù)據(jù)庫入門之DDL與數(shù)據(jù)庫對(duì)象”,方便廣大網(wǎng)友查閱!

數(shù)據(jù)庫對(duì)象

常見:表:存放數(shù)據(jù)的基本數(shù)據(jù)庫對(duì)象,由行(記錄)和列(字段)組成

約束條件:執(zhí)行數(shù)據(jù)校驗(yàn),保證數(shù)據(jù)完整性的系列規(guī)則

視圖:表中數(shù)據(jù)的邏輯顯示

索引:根據(jù)表中指定的字段建立起來的順序,用于提高查詢性能

序列:一組有規(guī)律的整數(shù)值

同義詞:對(duì)象的別名

命名:必須以字母開頭??梢园帜?、數(shù)據(jù)、下劃線、$、#

同一方案(用戶)下的對(duì)象不能重名。不能使用Oracle的保留字

補(bǔ)充:Oracle數(shù)據(jù)庫中的表分為用戶定義的表和數(shù)據(jù)字典表

用戶定義的表:用戶自己創(chuàng)建并維護(hù)的一組表,包含了用戶所需的信息

數(shù)據(jù)字典表:由Oracle數(shù)據(jù)庫自動(dòng)創(chuàng)建并維護(hù)的一組表,包含數(shù)據(jù)庫信息

創(chuàng)建表

概述:創(chuàng)建表需要兩個(gè)前提條件,即具備創(chuàng)建表的權(quán)限和有可用的存儲(chǔ)空間

創(chuàng)建表時(shí)必須指定表名、字段名、字段類型。create table為DDL語句,一經(jīng)執(zhí)行不可撤銷

語法:create table [schema.]table(column datatype [default expr][,...]);--缺省是將表創(chuàng)建在當(dāng)前方案(用戶)下

舉例:create table scott.test1(name varchar2(20),hiredata date default sysdate,salary number(8,2) default 0);

向test1插入新記錄的時(shí)候,若沒有指定hiredate值,缺省就會(huì)取當(dāng)前的系統(tǒng)時(shí)間。同樣也設(shè)置了salsry的缺省值為0

如果插入記錄的時(shí)候也沒有指定eid的值,那么eid的缺省值是null。注意數(shù)值型的缺省值不是0,而是null

補(bǔ)充:還可以使用子查詢創(chuàng)建表。這是創(chuàng)建表的另一種方式,但不是很常用。即創(chuàng)建表的同時(shí)將子查詢的結(jié)果直接插入其中

新建表與子查詢結(jié)果的字段列表必須匹配。新建表的字段列表可以缺省,這時(shí)字段名就跟子查詢的結(jié)果的字段名相同

語法:create table [schema.]table(column[,...]) as subquery;--括號(hào)中不可以定義字段類型

舉例:create table myemp2 as select empno,ename,sal*12 from emp;--非法。表達(dá)式不可以充當(dāng)字段,需要指定別名

create table myemp2 as select empno,ename,sal*12 annsal from emp;--合法

create table myemp(編號(hào),姓名,年薪) as select empno,ename,sal*12 from emp;--指定新建表的字段名

修改表結(jié)構(gòu)

概述:使用alter table語句修改表的結(jié)構(gòu)。包括添加、修改、刪除字段。alter語句為DDL語句,一經(jīng)執(zhí)行不可撤銷

添加:在alter table語句中使用add子句添加新字段。新字段只能被加到整個(gè)表的最后

alter table table add(column datatype [default expr] [column datatype]...);

alter table test1 add(grade number(3),phone varchar2(20) default '無');

修改:在alter table語句中使用modify子句修改現(xiàn)有字段。包括數(shù)據(jù)類型、大小和默認(rèn)值。但不可以修改字段名

alter table table modify(column datatype [default expr] [column datatype]...);

alter table test1 modify(grade number(2),phone varchar2(15) default '010-12345678');

修改的缺省值設(shè)置,只對(duì)此后新插入的記錄有效。修改操作會(huì)受到當(dāng)前表中已有數(shù)據(jù)的影響

當(dāng)已有記錄的相應(yīng)字段只包含空值時(shí),類型和大小都可以修改。如果該字段已包含數(shù)值,則修改可能失敗

刪除:在alter table語句中使用drop子句刪除字段。從每行中刪除該字段占據(jù)的長度和數(shù)據(jù),釋放在數(shù)據(jù)塊中占用的存儲(chǔ)空間

alter table table drop(column[,column]...);

alter table test1 drop(grade,phone);

清空表數(shù)據(jù)

概述:使用truncate table可以清空表中數(shù)據(jù)。清除表中所有記錄,釋放表的存儲(chǔ)空間,它是DDL語句,一經(jīng)執(zhí)行不可撤銷

它與DML中的delete語句有很大的差別。delete可以進(jìn)行條件性的刪除,也可以定義到事務(wù)中,對(duì)其進(jìn)行回滾或撤銷

語法:truncate table table;--它清除的并不是表格本身,表的結(jié)構(gòu)還是存在的,只不過變成了一個(gè)空表

刪除表

概述:使用drop table語句刪除表,它是DDL語句,一經(jīng)執(zhí)行不可撤銷

表中所有數(shù)據(jù)將被刪除,此前未完成的事務(wù)將被提交,所有相關(guān)的索引被刪除

語法:drop table table;

重命名表

概述:使用rename語句可以改變現(xiàn)有表的名稱,它是DDL語句,一經(jīng)執(zhí)行不可撤銷

也可修改其它數(shù)據(jù)庫對(duì)象(視圖、序列、同義詞等)的名稱。執(zhí)行重命名操作的必須是對(duì)象的所有者

語法:rename old_name to new_name;

舉例:rename test1 to test88;

數(shù)據(jù)字典

概述:數(shù)據(jù)字典是Oracle數(shù)據(jù)庫的核心,用于描述數(shù)據(jù)庫及其所有對(duì)象。數(shù)據(jù)字典由一系列只讀的表和視圖組成

這些表和視圖屬SYS用戶擁有,由Oracle Server負(fù)責(zé)維護(hù),用戶可以通過select語句進(jìn)行訪問

內(nèi)容:數(shù)據(jù)庫的物理和邏輯結(jié)構(gòu)。對(duì)象的定義和空間分配。完整性約束條件。用戶。角色。權(quán)限。審計(jì)記錄

視圖:數(shù)據(jù)字典中的視圖都是只讀的,主要可以分為如下三類

dba(所有方案包含的對(duì)象信息)、all(用戶可以訪問的對(duì)象信息)、user(用戶方案的對(duì)象信息)

舉例:select table_name from user_tables;--查看當(dāng)前用戶擁有的所有表的名字

select table_name from all_tables;--查看當(dāng)前用戶可以訪問的所有表的名字

select distinct object_type from user_objects;--查看當(dāng)前用戶擁有的所有對(duì)象的類型

select distinct object_type from all_objects;--返回當(dāng)前用戶可以查看的所有的對(duì)象的類型

select table_name frome dba_tables;--查看所有用戶擁有的所有表的名字

select * from user_constraints;--查看當(dāng)前方案(用戶)下所有的約束的信息

select * from user_constraints where table_name='student';--查看當(dāng)前方案(用戶)下的student表中的約束信息

約束(Constraint)

概述:約束是在表上強(qiáng)制執(zhí)行的數(shù)據(jù)校驗(yàn)規(guī)則,用于保護(hù)數(shù)據(jù)的完整性

具體包括五種,即not null(非空)、unique key(唯一鍵)、primary key(主鍵)、foreign key(外鍵)、check(檢查)

分類:域完整性約束:not null、check。實(shí)體完整性約束:unique、primary key。參照完整性約束:foreign key

說明:約束也是一種數(shù)據(jù)庫對(duì)象。如果創(chuàng)建約束時(shí),用戶沒有指定它的名字,那么系統(tǒng)會(huì)自動(dòng)的為其命名

在Oracle使用SYS_Cn格式命名約束,也可以由用戶命名。也可以通過數(shù)據(jù)字典視圖查看約束

可以在建表的同時(shí)添加約束,也可以在建表后單獨(dú)添加約束。可以在表級(jí)或列級(jí)定義約束

通常并不太建議在建表之后再添加約束或者建表之后再修改表的結(jié)構(gòu)

查看:查詢用戶字典視圖user_constraints可得到當(dāng)前用戶的所有約束。即select * from user_constraints;

查詢用戶字典視圖user_cons_columns可獲知約束建立在哪些字段上。即select * from user_cons_columns;

創(chuàng)建:create table [schema.]table(column datatype[default expr][column_constraint],...[table_constraint]);

alter table table add [constraint constraint_name] constraint_type(column);--這是建表后添加約束

比如alter table stu add constraint stu_sid_pk primary key(sid);--原stu表中有sid和name兩個(gè)字段

等價(jià)alter table stu add primary key(sid);--只不過此時(shí)的約束名就會(huì)由系統(tǒng)自動(dòng)設(shè)定了

特例:建表后添加約束時(shí),非空約束必須使用modify子句添加。實(shí)際上相當(dāng)于重新定義了某個(gè)字段

如alter table stu modify(name not null);或alter table stu modify(name char(8) default 'N/A' not null);

也可以修改多個(gè)字段,如alter table stu modify(sid not null,name default 'Stone' not null);

刪除:語法為alter table table drop constraint constraint_name;

alter table table drop primary key;--刪除主鍵的另一種方式。只有主鍵才可以這樣刪除

因?yàn)橐粋€(gè)表中只可以定義一個(gè)主鍵,所以不會(huì)有二義性。而其它的約束,都可能定義多個(gè)

續(xù)一:刪除約束時(shí),若存在與該約束相關(guān)聯(lián)的其它約束,則刪除操作會(huì)失敗??捎胏ascade子句將其它關(guān)聯(lián)約束一并刪除

語法為alter table table drop constraint constraint_name cascade;

這個(gè)時(shí)候一共刪除了兩個(gè)約束,一個(gè)是主表中的主鍵,一個(gè)是子表中的外鍵

續(xù)二:刪除表中字段時(shí),若該字段處于多字段聯(lián)合約束條件(聯(lián)合主鍵、聯(lián)合唯一鍵、存在參照當(dāng)前字段的外鍵)中時(shí)

則刪除會(huì)失敗。此時(shí)可使用cascade constraints子句將與該字段相關(guān)的約束一并刪除

語法為alter table table drop(column[,column]...) cascade constraints;

禁用:在alter table中,可使用disable constraint子句禁用已有約束。也可用cascade選項(xiàng)將相關(guān)聯(lián)的約束也一并刪除

語法為alter table table disable constraint constraint_name [cascade];

禁用跟刪除不同,它還可以啟用。而且約束的具體內(nèi)容或約束的定義等,還是存在的,只是臨時(shí)不起作用了

啟用:在alter table中,可使用enable constraint子句啟用已被禁用的約束

語法為alter table table enable constraint constraint_name;

啟用約束后,就無法再使用cascade選項(xiàng)一并啟用相關(guān)聯(lián)的其它約束。若仍想使用其它約束,則只能重建其它約束

非空約束(not null)

特點(diǎn):只能在字段級(jí)定義。確保字段值不能為空。一個(gè)表中可以定義多個(gè)非空約束

舉例:create table strudent(sid number(3) not null,name varchar2(20),birth date constraint nn not null);

說明:constraint nn not null也是非空約束,只不過birth的約束名字是由用戶命名的,而sid的約束是由系統(tǒng)命名的

constraint是一個(gè)保留字,說明這里要添加一個(gè)約束,nn是約束的名字,后面的not null是約束的類型

按照慣例,約束名習(xí)慣命名為“表名_字段名_約束的類型簡(jiǎn)稱”這里就應(yīng)該是student_birth_nn

唯一性約束(unique)

特點(diǎn):既可以在字段級(jí)定義,也可以在表級(jí)定義。用于確保所在的字段(或字段組合)不出現(xiàn)重復(fù)值

唯一性約束的字段允許出現(xiàn)空值。Oracle會(huì)自動(dòng)為唯一性約束創(chuàng)建對(duì)應(yīng)的唯一性索引。一個(gè)表中可以定義多個(gè)唯一鍵

舉例:create table student(sid number(3) unique,name varchar2(20));--字段級(jí)定義

create table student(sid number(3),name varchar2(20),constraint strudent_sid_un unique(sid));--表級(jí)約束

說明:對(duì)一個(gè)字段進(jìn)行唯一性約束時(shí),這兩種效果相同的。若需要對(duì)多個(gè)字段定義唯一性約束的話,則只能定義成表級(jí)約束

如create table fenshu(a number(3),b varchar2(20),c number(4),constraint fenshu_a_b_un unique(a,b));

也就是說a和b兩個(gè)字段的值組合起來不能出現(xiàn)重復(fù)??梢园阉胂蟪墒且粡垖W(xué)生分?jǐn)?shù)表,a和b相當(dāng)于學(xué)號(hào)和科目

主鍵約束(primary key)

特點(diǎn):主鍵既可以在字段級(jí)定義,也可以在表級(jí)定義。主鍵用于唯一標(biāo)識(shí)表中的某一行記錄,功能上相當(dāng)于非空且唯一

一個(gè)表中只允許一個(gè)主鍵,主鍵可以是單個(gè)字段或多字段的組合。Oracle會(huì)自動(dòng)為主鍵字段創(chuàng)建對(duì)應(yīng)的唯一性索引

舉例:create table student(sid number(3) primary key, name varchar2(20));

create table student(sid number(3),name varchr2(20), constraint student_sid_pk primary key(sid));

聯(lián)合:由多個(gè)字段組合而成的主鍵也稱聯(lián)合主鍵。聯(lián)合主鍵中每一個(gè)字段都不能為空

聯(lián)合主鍵字段組合的值不能出現(xiàn)重復(fù)。聯(lián)合主鍵只能定義為表級(jí)約束

create table fenshu(a number(3),b varchar2(20),c number(3),constraint fenshu_a_b_pk primary_key(a,b));

同樣是學(xué)生分?jǐn)?shù)表。其實(shí)學(xué)號(hào)和科目組合起來更應(yīng)該設(shè)成主鍵,而不是唯一鍵,因?yàn)樗鼈兊闹狄膊粦?yīng)該為空

外鍵約束(foreign key)

特點(diǎn):外鍵用于確保相關(guān)的兩個(gè)字段之間的參照關(guān)系,以實(shí)現(xiàn)參照完整性約束。外鍵參照的必須是主表的主鍵或者唯一鍵

外鍵約束通常構(gòu)建于來自不同表的兩個(gè)字段之間。子表外鍵列的值必須在主表參照列值的范圍內(nèi),或者為空

主表的主鍵或唯一鍵被子表參照時(shí),主表相應(yīng)記錄不允許被刪除。

參照:所謂的參照完整性約束,比如說員工信息表和工資表,二者是通過員工編號(hào)建立連接的

這時(shí)工資表中的員工編號(hào)是受限制的,即必須是出現(xiàn)在員工信息表中的,這種關(guān)系稱之為參照關(guān)系

舉例:create table info(id number(3) primary key,name varchar2(20),job varchar2(20),birth date);

create table sal(a number(3) references info(id),b number(8,2));--將外鍵約束定義成字段級(jí)約束

create table sal(a number(3),b number(8,2),constraint sal_a_fk foreign key(a) references info(id));

說明:子表sal中的a字段被定義為外鍵,它參照的是主表info中的id字段。這里是把外鍵約束定義成了表級(jí)約束

執(zhí)行完這兩行語句之后,兩個(gè)表中均沒有數(shù)據(jù)。若再執(zhí)行insert into sal(a,b) values(1,2);則會(huì)出現(xiàn)錯(cuò)誤

因?yàn)橄到y(tǒng)并沒有在子表所參照的主表中的某一條記錄上找到id為1的字段的值

此時(shí)可以在剛才的插入語句之前先執(zhí)行insert into info values(1,'Tom','Adv',sysdate);就不會(huì)出現(xiàn)錯(cuò)誤了

如果此時(shí)再執(zhí)行insert into sal(null,8);則該記錄插入成功。外鍵畢竟不同于主鍵,這也不算違背參照規(guī)則

接著再執(zhí)行一次insert into sal(1,8)則記錄插入成功。這種插入null和重復(fù)記錄的方式都是不合理的

為了實(shí)現(xiàn)數(shù)據(jù)的合理化,此時(shí)也可以進(jìn)行其它的限制。即字段a在作為外鍵的同時(shí),還可以進(jìn)行主鍵的限制

即create table sal(a number(3) primary key references info(id),b number(8,2));

或create table sal(a number(3) primary key,b number(8,2),constraint sal_a_fk foreign key(a) references info(id));

檢查約束(check)

特點(diǎn):只能在字段級(jí)定義。它定義每一行(的指定字段)都必須滿足的條件。以條件表達(dá)式的形式給出數(shù)據(jù)需要符合的條件

條件中不允許出現(xiàn)currval,nextval,level,rownum等偽列或sysdate,uid,user,userenv等函數(shù)或?qū)ζ渌侄沃档囊?/P>

currval即序列當(dāng)前的值。nextval即序列生成器的下一個(gè)序列值。level即在層次化查詢的過程中標(biāo)明查詢的層數(shù)

sysdate即當(dāng)前系統(tǒng)時(shí)間。uid即當(dāng)前用戶的id號(hào)。user即當(dāng)前用戶名。userenv用來查詢客戶端的環(huán)境,包括語言或用戶名等等

舉例:create table test1(name varchar2(20) check(length(name)>=6),age number(3) check(age>=0 and age<=120));

create table test1(name varchar2(20) check(name is not null),age number(3));--這就等價(jià)于非空約束了

視圖(View)

概述:視圖由一個(gè)或多個(gè)表(或視圖)中提取數(shù)據(jù)而成。視圖是一種虛擬表。視圖一經(jīng)創(chuàng)建就可以當(dāng)作表來使用

使用視圖可以簡(jiǎn)化復(fù)雜的數(shù)據(jù)查詢。能夠提高運(yùn)行效率??梢云帘螖?shù)據(jù)庫表結(jié)構(gòu),實(shí)現(xiàn)數(shù)據(jù)邏輯獨(dú)立性

還可以限制數(shù)據(jù)庫訪問。也可以在相同數(shù)據(jù)上提供不同的視圖,便于數(shù)據(jù)共享。視圖也可以有主鍵等等

可以通過在create view語句中嵌入子查詢的方式創(chuàng)建視圖

創(chuàng)建:create [or replace] view [schema.]view [(alias[,aliasx]...)] as subquery;

舉例:create or replace view v1(編號(hào),姓名,工資) as select empno,ename,sal from emp where deptno=20;

建議在創(chuàng)建視圖時(shí)加上or replace,即如果存在重名視圖,則替換掉重名視圖

而且不允許在括號(hào)中列出字段類型,因?yàn)榫唧w的字段類型由子查詢的結(jié)果決定

強(qiáng)調(diào):可用force選項(xiàng)強(qiáng)制創(chuàng)建視圖。即無論預(yù)期中的字段或基表是否存在,都要強(qiáng)制創(chuàng)建視圖

也就是先給出一個(gè)視圖的定義。但此時(shí)不能對(duì)這個(gè)連基表都不存在的視圖進(jìn)行查詢,原因不言自明

語法為create [or replace] [force|noforce] view [schema.]view [(alias[,aliasx]...)] as subquery;

比如create or replace force view v2 as select empno,ename,job,sal from emp2 where deptno=20;

假定此時(shí)不存在emp2表,當(dāng)然這些字段存不存在就無從談起了,如果不使用force選項(xiàng),肯定無法創(chuàng)建視圖

缺省為不強(qiáng)制(即noforce)創(chuàng)建視圖。實(shí)際上不建議強(qiáng)制創(chuàng)建視圖

查詢:和查詢表數(shù)據(jù)一樣,可以使用select * from v1;來查詢視圖中的數(shù)據(jù)

它的實(shí)現(xiàn)細(xì)節(jié)是這樣的,當(dāng)數(shù)據(jù)庫服務(wù)器接收到應(yīng)用程序或SQLPlus等客戶端軟件發(fā)送過來的查詢視圖的指令的時(shí)候

首先會(huì)在當(dāng)前方案下尋找名字叫v1的視圖定義,即定義視圖的create語句,也就是create or replace view v1...

找到v1的定義之后,便執(zhí)行定義中的子查詢,再把查詢的結(jié)果返回給客戶端

這意味著每次引用或者訪問視圖的時(shí)候,都會(huì)執(zhí)行一次子查詢,都會(huì)查一下底層的物理表

所以物理表中的任何數(shù)據(jù)更新,都會(huì)立即在視圖的查詢中體現(xiàn)出來

續(xù)一:可以用desc v1查看視圖結(jié)構(gòu)??梢杂胐rop view v1刪除視圖

所謂的臨時(shí)表是在程序運(yùn)行的過程中,根據(jù)需要而臨時(shí)創(chuàng)建的一張表。通常是利用create table創(chuàng)建臨時(shí)表

臨時(shí)表只是臨時(shí)用到它,用完了便刪除。類似于臨時(shí)文件,但臨時(shí)表所保存的是真正的數(shù)據(jù),這跟虛擬表不同

續(xù)二:創(chuàng)建視圖的時(shí)候,也可以不指定字段名。缺省視圖的字段屬性都與子查詢結(jié)果中的字段屬性相同

若子查詢中使用了別名,視圖則采用別名作為它的字段名。而且子查詢中的表達(dá)式或函數(shù)不允許作為視圖的字段名

續(xù)三:實(shí)際上視圖的定義和表的定義一樣,都應(yīng)該在應(yīng)用程序開發(fā)的時(shí)候,在數(shù)據(jù)庫設(shè)計(jì)階段就確定下來它們數(shù)目個(gè)功能

即創(chuàng)建一定數(shù)量的表,以保存最底層基礎(chǔ)的數(shù)據(jù)。并設(shè)定好哪些數(shù)據(jù)需要以視圖的方式交由具體的程序模塊去使用

復(fù)雜:也可以創(chuàng)建復(fù)雜視圖,也就是說子查詢還可以復(fù)雜一些

如果某業(yè)務(wù)經(jīng)常需要查詢統(tǒng)計(jì)信息,那么只需要?jiǎng)?chuàng)建一個(gè)這樣的視圖就可以了,而不必每次都執(zhí)行子查詢以獲得數(shù)據(jù)

比如create or replace v_emp(工號(hào),姓名,職位,年薪,工齡(月),部門編號(hào),部門名稱,)

as select empno, ename, job, sal*12, month_between(sysdate,hiredate), emp.deptno, dname

from emp, dept where emp.deptno=dept.deptno;

更新:在可更新視圖上進(jìn)行DML操縱,可以修改基表中的數(shù)據(jù)。語法與在表上操作相同,分別為insert、update、delete語句

可更新視圖的定義中不能使用分組函數(shù)、group by子句、distinct關(guān)鍵字、rownum偽列,而且字段的定義不能為表達(dá)式

由兩個(gè)以上基表中導(dǎo)出的視圖不可更新?;碇蟹强盏牧性谝晥D定義中未包括,則不可在視圖上進(jìn)行insert操作

這種操作很容易出錯(cuò),實(shí)際上在真實(shí)的開發(fā)中很少這么做,也不建議通過視圖去更新底層數(shù)據(jù)

只讀:在創(chuàng)建視圖時(shí),可使用with read only選項(xiàng)將之設(shè)置為只讀

語法為create [or replace] view [schema.]view [(alias[,aliasx]...)] as subquery [with read only];

臨時(shí):嵌入到SQL語句中的子查詢都是臨時(shí)視圖。比如說用子查詢建表或TopN分析等等所涉及到的子查詢都屬于臨時(shí)視圖

臨時(shí)視圖不是數(shù)據(jù)庫對(duì)象,其定義不會(huì)長久保存在數(shù)據(jù)庫中,本次運(yùn)行后即被清除。它類似于Java語言中創(chuàng)建的匿名類

索引(Index)

概述:是一種用于提升查詢效率的數(shù)據(jù)庫對(duì)象。索引信息與表獨(dú)立存放。它可以通過快速定位數(shù)據(jù)的方法,減少磁盤I/O操作

索引分為兩類,即唯一性索引和非唯一索引。Oracle數(shù)據(jù)庫自動(dòng)使用和維護(hù)索引

創(chuàng)建:自動(dòng)創(chuàng)建:在定義主鍵或唯一鍵約束時(shí),系統(tǒng)會(huì)自動(dòng)在相應(yīng)的字段上創(chuàng)建唯一性索引

手動(dòng)創(chuàng)建:用戶可以在其它列上創(chuàng)建非唯一的索引,以加速查詢

語法為create index [schema.]index on table(column[,column]...);

比如說create index myindex on emp(ename);--查詢表時(shí),若以ename作為查詢條件的話,就很容易定位到某行記錄了

刪除:使用drop index語句刪除索引,如drop index myindex;操作者必須是索引的所有者,或擁有drop該index的權(quán)限

刪除表時(shí),相關(guān)的索引(和約束)將被自動(dòng)刪除,但視圖和序列將保留

原則:適合于創(chuàng)建索引:字段取值的分布范圍很廣。字段中包含大量空值。字段經(jīng)常出現(xiàn)在where子句或連接條件中

表經(jīng)常被訪問,或表數(shù)據(jù)量很大時(shí),且通常每次訪問的數(shù)據(jù)量小于記錄總量的2%~4%

不適合創(chuàng)建索引:表很小。字段不經(jīng)常出現(xiàn)在where子句中。每次訪問的數(shù)據(jù)量大于記錄總數(shù)的2%~4%

表經(jīng)常更新。被索引的字段作為表達(dá)式的一部分被引用

查看:查詢用戶字典視圖user_indexes可得到用戶的所有索引。如select * from user_indexes;

查詢用戶字典視圖user_ind_columns可獲知索引建立在哪些字段上。如select * from user_ind_columns;

函數(shù):基于表達(dá)式的索引被統(tǒng)稱為基于函數(shù)的索引。索引表達(dá)式由表中的字段、常量、SQL函數(shù)和自定義函數(shù)構(gòu)建而成

創(chuàng)建函數(shù)索引語法為create index [schema.]index on table(function(column));

創(chuàng)建函數(shù)索引create index myindex on emp(lower(ename));

使用函數(shù)索引select * from emp where lower(ename)='king';

在使用時(shí),條件中的字段需要與創(chuàng)建索引時(shí)指定的相同,索引才會(huì)起作用。即lower(ename)需要前后一致

序列(Sequence)

概述:是由系統(tǒng)自動(dòng)生成的,不重復(fù)的整數(shù)值。序列是一種數(shù)據(jù)庫對(duì)象,可以被多個(gè)用戶共享。序列可以代替應(yīng)用程序編號(hào)

序列的最典型的用途是作為主鍵值,它對(duì)于每一行必須是唯一的??梢詫?duì)序列值進(jìn)行緩沖存儲(chǔ),以提高訪問效率

但在應(yīng)用程序中生成編號(hào)的話,會(huì)產(chǎn)生性能瓶頸的。也就是說比較麻煩,要確保它的唯一性,還要它的保證效率

所謂的緩沖存儲(chǔ)是指,在使用序列之前,先生成指定的多個(gè)序列的取值作為備用,這樣能提高訪問效率

從實(shí)際應(yīng)用的角度來講,序列的重要性遠(yuǎn)遠(yuǎn)超過視圖和索引,跟約束條件以及表的重要性相當(dāng)

查看:查詢數(shù)據(jù)字典視圖user_sequences可獲得用戶序列信息

創(chuàng)建:create sequence [schema.]sequence [increment by n][start with n]

[{maxvalue n|nomaxvalue}][{minvalue n}|nominvalue][{cycle|nocycle}][{cache n|nocache}][{order|noorder}];

舉例:create sequence mysequence2;

create sequence mysequence1 increment by 1 start with 1 nomaxvalue nocycle;

釋一:increment指明當(dāng)前序列號(hào)遞增的值,缺省為1。start with指定當(dāng)前序列號(hào)的起始值,缺省為1

maxvlaue設(shè)定序列號(hào)的最大值。缺省為nomaxvalue,即沒有最大值。同理minvalue就是設(shè)定序列號(hào)的最小值

cycle設(shè)置在序列達(dá)到最大值之后,是否重新從1開始循環(huán),缺省為nocycle,即不循環(huán)

釋二:實(shí)際上nomaxvalue在實(shí)現(xiàn)的過程中,是有最大值的,大約是10的27次方。同理nominvalue是10的負(fù)27次方

而且在使用序列的時(shí)候,一般不應(yīng)該讓它循環(huán)。避免出現(xiàn)預(yù)期以外的數(shù)據(jù)的重復(fù)

釋三:cache設(shè)置是否進(jìn)行緩沖存儲(chǔ)。它的缺省值不是nocache,而是cache 20

也就是說cache會(huì)先生成20個(gè)序列號(hào)備用,當(dāng)序列號(hào)被用掉了一個(gè)之后,它就會(huì)再補(bǔ)充上一個(gè)

這種通過備用的方式,能夠使程序運(yùn)行效率會(huì)高一點(diǎn)。但是緩存序列號(hào)有可能會(huì)有丟失,倒不是出錯(cuò),只是不連續(xù)而已

釋四:order保證生成的序列號(hào)一定是按照請(qǐng)求的順序。其實(shí)對(duì)于單進(jìn)程或者單線程的程序(即非并發(fā)性的訪問)來說沒有什么差別

若在并發(fā)(也叫并行)工作模式下,多個(gè)請(qǐng)求同時(shí)請(qǐng)求同一個(gè)序列號(hào)的時(shí)候,分配給它們序列號(hào)就有可能是不保證順序的

只是順序不保證,但值還是唯一的,不會(huì)重復(fù)。實(shí)際上它對(duì)我們來說影響不大。比如有兩個(gè)請(qǐng)求先后同時(shí)到達(dá)

如果用order來保證的話,那么先到達(dá)的請(qǐng)求所請(qǐng)求到的序列號(hào)就會(huì)是101,后到達(dá)的就是102

但如果nooder就可能出現(xiàn)先到達(dá)的請(qǐng)求得到的反而是102,后到達(dá)的可能是101,因?yàn)橹虚g有一個(gè)交替的過程

缺省為noorder,即不保證序列號(hào)是按照請(qǐng)求順序生成的

使用:select mysequence1.nextval from dual;--其實(shí)它會(huì)新生成一個(gè)序列號(hào),返回一個(gè)整數(shù)值

select mysequence1.currval from dual;--取出當(dāng)前的序列號(hào)。這種直接的查詢,意義不大

insert into test1 values(mysequence1.nextval,'Tom');--這才是真正的使用序列

nextval偽列用于從指定的序列數(shù)值中取出下一個(gè)值。currval偽列引用的是指定序列的“當(dāng)前值”

使用緩存(cache n)可提高訪問效率。使用nocache和order設(shè)置會(huì)降低運(yùn)行效率

當(dāng)在回滾、系統(tǒng)異常、多個(gè)表同時(shí)使用同一序列等情況下,可能會(huì)使得序列不連續(xù)

修改:alter sequence [schema.]sequence [increment by n][{maxvalue n|nomaxvalue}]

[{minvalue n}|nominvalue][{cycle|nocycle}][{cache n|nocache}][{order|noorder}];

操作者必須是序列的所有者,或者擁有alter該序列的權(quán)限。只有未來再生成的序列數(shù)受影響

修改時(shí)會(huì)進(jìn)行一些驗(yàn)證,比如新的maxvalue如果小于當(dāng)前的序列值就會(huì)報(bào)錯(cuò)。序列的初始值不可更改

為了避免跟現(xiàn)有的序列號(hào)發(fā)生重復(fù),所以序列的初始值不可更改

刪除:使用drop sequence語句刪除序列。操作者須是序列的所有者,或擁有drop該sequence的權(quán)限

同義詞

概述:相當(dāng)于對(duì)象的別名,使用同義詞可以方便訪問其它用戶的對(duì)象,也能夠縮短對(duì)象名字的長度

創(chuàng)建:create [public] synonym synonym fro object;

create synonym gt1 for emp;

使用:select * from gt1;

刪除:drop synonym gt1;

說明:若不加public,那么定義的同義詞則只能在當(dāng)前方案(用戶)的環(huán)境中可用,其它用戶則無法使用該同義詞

而加了public后,其它的方案(用戶)便也可以使用這個(gè)同義詞了

但必須是具有相應(yīng)權(quán)限的用戶(如DBA)才有資格將同義詞定義為public類型

更多信息請(qǐng)查看IT技術(shù)專欄

更多信息請(qǐng)查看數(shù)據(jù)庫
易賢網(wǎng)手機(jī)網(wǎng)站地址:Oracle數(shù)據(jù)庫入門之DDL與數(shù)據(jù)庫對(duì)象
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請(qǐng)考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇?zhǔn)!

2025國考·省考課程試聽報(bào)名

  • 報(bào)班類型
  • 姓名
  • 手機(jī)號(hào)
  • 驗(yàn)證碼
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡(jiǎn)要咨詢 | 簡(jiǎn)要咨詢須知 | 加入群交流 | 手機(jī)站點(diǎn) | 投訴建議
工業(yè)和信息化部備案號(hào):滇ICP備2023014141號(hào)-1 云南省教育廳備案號(hào):云教ICP備0901021 滇公網(wǎng)安備53010202001879號(hào) 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號(hào)
云南網(wǎng)警備案專用圖標(biāo)
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號(hào):hfpxwx
咨詢QQ:526150442(9:00—18:00)版權(quán)所有:易賢網(wǎng)
云南網(wǎng)警報(bào)警專用圖標(biāo)