表和索引对象
目的
(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表不能成功,原因sno是hospital表的主键同时也是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;
表1 企业(business)表结构
表2医院(hospital)表结构
表3医保卡(card)表结构
表4员工(staff)表结构
表5就诊表(see)结构
表6消费(consume)表结构
表7医保(insurance)表结构
1. 在Oracle数据库中,根据生存周期不同,分为永久性表和临时表;根据组织方式不同,分为标准表、索引化表、分区表和外部表。
2. 临时表创建完后,其中的数据在特定条件下自动释放,但其结构将一直存在。
根据临时表中数据被释放的时间不同,临时表分为事务级别的临时表和会话级别的临时表两类。
3. 表中索引数目越多,查询速度越快,但表的更新速度越慢。因为索引越多,维护索引所需开销越大,当更新表时,需要同时更新与表相关的所有索引。 所以要限制表中索引的数目 。
4. 在实验中特别要注意你是在哪个用户下建的表和索引,这样在实验的过程中不容易出错。
5. 表中索引数目越多,查询速度越快,但表的更新速度越慢。因为索引越多,维护索引所需开销越大,当更新表时,需要同时更新与表相关的所有索引。 所以要限制表中索引的数目 。
6. 默认情况下,索引与表存储在同一表空间中。索引与表存储在同一表空间中,有利于数据库维护操作,具有较高的可用性;反之,若索引与表存储在不同的表空间中,则可提高系统的存取性能,减少硬盘I/O冲突,但是表与索引可用状态可能出现不一致,如一个处于联机状态,另一个处于脱机状态。