表和索引对象

表和索引对象

目的

(1) 掌握表结构的建立、修改、查看、删除操作。

(2) 掌握索引对象的建立、查看和删除操作。

步骤:

1.创建表结构

利用命令行方式将下列各表建立到员工医疗保险系统数据库中。表结构如附录员工医疗保险系统表1-7所示。则所建的表语句如下:

1)建立business

create table business(bno char(10)primary key,bname char(50) not null,btype char(4) check(btype in('企业','事业','私有')),baddress char(20),btel char(13))

 

2)建立hospital

create table hospital(hno char(5) primary key,hname char(40) not null,haddress char(60));

 

3)建立card

create table card(cno char(15) primary key,ctype char(8) check(ctype in('企业','事业','灵活企业')),cmoney number(7,2) not null);

 

 

4)建立staff

create table staff(sno char(5) primary key,sname char(20) not null,ssex char(2) check(ssex in('','')),sbirthday date,saddress char(20),stel char(15)unique,cno char(15),bno char(10),constraint fk_cno foreign key(cno) references card(cno),constraint fk_bno foreign key(bno) references business(bno));

 

 

5)建立see

create table see(sno char(5),hno char(5),constraint fk_hno foreign key(hno) references hospital(hno),constraint  fk_sno foreign key(sno)references staff(sno) on delete cascade,sdate date,primary key(sno,hno,sdate));

 

 

6)建立consume

create table consume(cno char(15),constraint fk_cno1 foreign key(cno) references card(cno) on delete cascade,hno char(5),constraint fk_hno1 foreign key(hno) references hospital(hno),csdate date not null,mname char(20),primary key(cno,hno,csdate),mnum int not null,csmoney number(7,2) not null);

 

 

7)建立insurance

create table insurance(idate date,cno char(15),primary key(idate,cno),constraint fk_cno2 foreign key(cno) references card(cno),imoney number(5,2) not null,bno char(10),constraint  fk_bno2 foreign key(bno) references business(bno));

 

 

2.查看表结构

(1) 利用OEM查看员工医疗保险系统所有表的字段信息和约束信息。

scott用户登录,进入以后点击schema后再点击tables就可以看到相关信息了,

1)如下图为表card 的信息:

 

 

2)如下图为business表的信息;

 

 

3).如下图为hospital表的信息

 

 

4)如下图为staff表的信息:

 

 

5)如下图为see表的信息:

 

 

6)如下图为consume表的信息

 

 

7)如下图为insurance表的信息:

 

(2) 利用SQL*Plus或iSQL*Plus从数据字典DBA_TAB _COLUMNS查看员工医疗保险系统所有表的字段信息。

Sql>select table_name,column_name,data_type,data_type_mod,data_type_owner,data_length,data_precision

From dba_tab_columns 

查询结果如下图所示:

 

(3) 利用SQL*Plus或iSQL*Plus从数据字典DBA_ CONSTRAINTS查看员工医疗保险系统所有表的约束信息。

Sql>select table_name,constraint_name,constraint_type,index_name from dba_constraints

  

 

3.修改表结构

(1) 利用SQL*Plus或iSQL*Plus将表“staff_sql”重新命名为“staff_sql0”。

Sql>Alter table staff rename to staff_sql0;

 

(2) 利用企业管理器为“staff_sql0”表添加“age INT”字段,利用DESC命令查看“staff_sql0”表的字段信息。

 

 

(3) 利用SQL*Plus或iSQL*Plus为“staff_sql0”表添加“salary NUMBER(5,2)”、“salary_add NUMBER(3,1)”两个字段,利用DESC命令查看“staff_sql0”表的字段信息。

Sql>alter table staff_sql0 add (salary number(5,2),salary_add number(3,1));

 

(4) 利用SQL*Plus或iSQL*Plus向“staff_sql0”表添加“sname”字段惟一性约束,从数据字典DBA_CONSTRAINTS查看“staff_sql0”表的约束信息。

Sql>alter table staff_sql0 modify(sname unique);

 

(5) 利用SQL*Plus或iSQL*Plus删除“staff_sql0”表上“sname”字段惟一性约束,从数据字典DBA_CONSTRAINTS查看“staff_sql0”表的约束信息。

首先查看sname这个字段对应的唯一性约束名

Sql>select a.table_name,column_name,a.index_name,constraint_name,constraint_type 

from dba_constraints a,dba_ind_columns b where a.index_name=b.index_name and a.table_name='STAFF_SQL0'; 然后删除sname字段对应的约束:

SQL> alter table staff_sql0 drop constraint sys_c0011406;

如图为删除后的信息:

 

(6) 利用企业管理器从“staff_sql0”表删除“age”字段,利用DESC命令查看“staff_sql0”表的字段信息。

如图为有age 时的信息

 

 

(7) 利用SQL*Plus或iSQL*Plus从“staff_sql0”表删除“salary”、“salary_add”两个字段,利用DESC命令查看“staff_sql0”表的字段信息。

SQL> alter table staff_sql0 drop(salary,salary_add);

 

 

(8) 利用SQL*Plus或iSQL*Plus将“staff_sql0”表“sname”字段长度修改为30,利用DESC命令查看“staff_sql0”表的字段信息。

SQL> alter table staff_sql0 modify(sname char(30));

 

 

4. 删除表结构

(1) 利用SQL*Plus或iSQL*Plus删除员工表3,看能否成功。从原理上解释原因,同时记录外键约束表删除顺序的影响。

删除card 表不会成功,card表中的cno是主键,同时也是staff_sql0表的外键,也是consume表和insurance表的主键,为了保持数据的完整性和一致性所以不可以删除。

要想删除表得首先禁用这个表关联的外键,然后删除外键,再删除表即可,也可以不删除外键,直接禁用外键后直接删除表。

(2) 利用企业管理器删除员工表2,看能否成功。从原理上解释原因。

删除hospital表不能成功,原因snohospital表的主键同时也是see表的主键,为了保持数据的完整性和一致性所以不可以删除。要想删除表得首先禁用这个表关联的外键,然后删除外键,再删除表即可,也可以不删除外键,直接禁用外键后直接删除表。

 

索引、视图、同义词及序列操作

1.创建索引

(1) 利用企业管理器为医院表的医院名称创建索引,并以降序排列,索引名为“hospital_name_index”。

如下图在Actions中选择’Create Index’ 再点击’Go’按钮即可进入创建索引界面

 

 

 

 

(2) 利用SQL*Plus或iSQL*Plus为员工表的员工姓名、员工性别、出生年月排序,以员工姓名升序、员工性别降序、出生年月降序排列,索引名为“staff_info_index”。

SQL>create index staff_info_index on  staff_sql0(sname asc,ssex desc,sbirthday desc);

 

  2.查看索引

(1) 利用企业管理器查看“ygbx_user”方案下有几个隶属于该方案的索引,有几个系统创建的索引,有几个用户创建的索引。

 

 

(2) 利用SQL*Plus或iSQL*Plus从DBA_INDEXES数据字典中查看员工医疗保险系统所有索引的信息。

SQL>  select table_name,index_name,index_type from dba_indexes

  2   where table_name in('BUSINESS','CARD','CONSUME','HOSPITAL','INSWRANCE','SEE','STAFF_SQL0');

 

(3) 利用SQL*Plus或iSQL*Plus从DBA_INDEXES数据字典中查看“staff_info_index”索引的信息,并查看该索引列的顺序及状态。

SQL> select index_name,index_type,status,uniqueness,num_rows,blevel

 2  from dba_indexes

 3  where index_name='STAFF_INFO_INDEX';

 

  3.删除索引

(1) 利用企业管理器删除“hospital_name_index”索引。

登陆后,点击’schema’,然后点击’index’ 得到如下图,填入object name 然后选中要删除的索引 ‘hospital_name_index’,点击‘delete ’即可,如下为执行成功的图:

 

 

  (2) 利用SQL*Plus或iSQL*Plus将“staff_info_index”索引删除。

SQL> drop index staff_info_index; 

 

附录:员工医疗保险系统表

企业(business)表结构

2医院(hospital)表结构

3医保卡(card)表结构

4员工(staff)表结构

5就诊表(see)结构

6消费(consume)表结构

7医保(insurance)表结构

 

 

总结: 

1. 在Oracle数据库中,根据生存周期不同,分为永久性表和临时表;根据组织方式不同,分为标准表、索引化表、分区表和外部表。

2. 临时表创建完后,其中的数据在特定条件下自动释放,但其结构将一直存在。

根据临时表中数据被释放的时间不同,临时表分为事务级别的临时表和会话级别的临时表两类。

3. 表中索引数目越多,查询速度越快,但表的更新速度越慢。因为索引越多,维护索引所需开销越大,当更新表时,需要同时更新与表相关的所有索引。 所以要限制表中索引的数目 。

4. 在实验中特别要注意你是在哪个用户下建的表和索引,这样在实验的过程中不容易出错。

5. 表中索引数目越多,查询速度越快,但表的更新速度越慢。因为索引越多,维护索引所需开销越大,当更新表时,需要同时更新与表相关的所有索引。 所以要限制表中索引的数目 。

6. 默认情况下,索引与表存储在同一表空间中。索引与表存储在同一表空间中,有利于数据库维护操作,具有较高的可用性;反之,若索引与表存储在不同的表空间中,则可提高系统的存取性能,减少硬盘I/O冲突,但是表与索引可用状态可能出现不一致,如一个处于联机状态,另一个处于脱机状态。 

 

 

你可能感兴趣的:(表和索引对象)