本文共 8587 字,大约阅读时间需要 28 分钟。
DM模式对象包括表、视图、索引、触发器等,下面将对这些模式对象的基本操作进行展示。
DM中支持的表包括普通表,分区表,列存表,对象表,临时表,外部表等,这里基于普通表和分区表进行操作.
1.1普通表 DM中支持创建/查询/删除普通行存表,支持自增列,检查约束,非空约束,缺省值等的设置. 1.1.1创表 首先创建一个普通行存表test,设置主键自增,非空约束,检查约束等.create table test( id int primary key identity(1,1), name varchar(10) not null, sex char(2) check(sex='男'or sex='女') not null, grade decimal, height decimal(4,1) not null, weight double not null, birth date not null )
1.1.2插入数据
插入符合约束条件的数据:insert into test values('张三','男',88.8,166.6,80,'1998-1-1');insert into test values('李四','男',88,166.6,85.5,'1998-2-2');insert into test values('王五','男',66.666,166.67,75.5,'1998-3-3');insert into test values('王芳','女',88,166,65,'1998-4-4');
接着插入不符合约束条件的数据,会报错,显示相应的错误信息:
insert into test values('赵六','无',null,175.68,80,'1998-1-1');
insert into test values('赵六','男',null,null,80,'1998-1-1');1.1.3删除表 使用命令drop table [表名]进行删除:
drop table test;
1.2分区表
DM中支持各种类型的分区表,如范围分区表,哈希分区表,列表分区表以及组合分区表. 1.2.1范围分区表 创建范围分区表的语法如下:create table callinfo( caller char(15), callee char(15), time datetime, duration int)partition by range(time)( partition p1 values less than('2020-04-01'), partition p2 values less than('2020-07-01'), partition p3 values less than('2020-10-01'), partition p4 values equ or less than(maxvalue));
范围分区表增加分区:
在范围分区表增加分区的时候,要注意如果设置的范围值由以maxvalue为上限的分区,要先将此分区删除,才能够成功的增加分区.例如: 范围分区表增加分区:alter table callinfo add partition p5 values less than('2020-12-31');
将显示错误:
删除范围分区表中范围为max value的分区:alter table callinfo drop partition p4;
再次增加分区,就可以成功添加分区:
alter table callinfo add partition p4 values less than('2020-12-31');
范围分区表拆分分区:
alter table callinfo split partition p2 at('2020-06-01') into (partition p2_1,partition p2_2);
范围分区表合并分区:
alter table callinfo merge partitions p2_1,p2_2 into partition p2;
范围分区表交换分区:
新建一个表change:create table change( caller char(15), callee char(15), time datetime, duration int);
交换分区:
alter table callinfo exchange partition p2 with table change;
1.2.2哈希分区表和列表分区表
哈希分区表和列表分区表的操作与范围分区表大体一致,只需要在创建分区的时候,哈希分区表指定以hash分区;列表分区表指定以list分区,然后使用不同的value值划分分区.1.2.3组合分区表
组合水平分区表层次最多支持八层,上面的三种分区表可以在组合分区表中按照需求交叉使用.这里进行列表分区表和范围分区表的组合分区表的操作. 创建组合分区表:create table sales( sales_id int, saleman char(20), saledate datetime, city char(10))partition by list(city) subpartition by range(saledate) subpartition template( subpartition p11 values less than('2020-04-01'), subpartition p12 values less than('2020-07-01'), subpartition p13 values less than('2020-10-01'), subpartition p14 values less than(maxvalue) ) ( partition p1 values('北京','天津') ( subpartition p11_1 values less than('2020-10-01'), subpartition p11_2 values less than(maxvalue) ), partition p2 values('上海', '南京', '杭州'), partition p3 values(default) );
这里一级分区是基于city进行的列表分区,二级分区则是基于时间的范围分区,可以在创建时指定二级,三级等分区的名字,如这里的p11_1,查询时可以直接使用p11_1进行插询,而没有指定名字的二级,三级等分区,如p2的下一级分区,在查询时可以使用p2_p11,p2_p12等进行查询.
DM支持普通视图和物化的视图的操作.
2.1普通视图 视图是从一个或几个基表(或视图)导出的表,它是一个虚表,即数据字典中只存放视图的定义(由视图名和查询语句组成),而不存放对应的数据,这些数据仍存放在原来的基表中.当需要使用视图时,则执行其对应的查询语句,所导出的结果即为视图的数据。 2.1.1创建student表并插入数据:create table student( id int primary key not null, name varchar(15) not null, sex char(2) check(sex in('男','女')) not null, birth date not null);insert into student values(1,'张三','男','1998-01-01');insert into student values(2,'李四','男','1998-02-02');insert into student values(3,'王五','男','1998-03-03');insert into student values(4,'王芳','女','1998-04-04');insert into student values(5,'赵六','男','1998-05-05');
2.1.2在student表上建立视图:
create view student_excellent asselect * from student ;
2.1.3查询视图,可以查询到相应数据:
select id,name,sex from student_excellent;2.1.4删除基表中的一列重新编译视图::
alter table student drop birth;alter view student_excellent compile;
发现编译失败:
2.1.5在基表中重新添加被删除的列,重新编译视图并查询视图:alter table student add birth varchar(10);alter view student_excellent compile;select * from student_excellent;
查询数据成功:
这里发现只要添加列的列名和被删除列的列名一样,即使类型不一样,视图还是可以重新编译和查询。2.2物化视图
物化视图是从一个或几个基表导出的表,同视图相比,它存储了导出表的真实数据。当基表中的数据发生变化时,物化视图所存储的数据将变得陈旧,用户可以通过手动刷新或自动刷新来对数据进行同步。 2.2.1建表并插入数据:create table student( id int primary key not null, name varchar(15) not null, sex char(2) check(sex in('男','女')) not null, birth date not null);insert into student values(1,'张三','男','1998-01-01');insert into student values(2,'李四','男','1998-02-02');insert into student values(3,'王五','男','1998-03-03');insert into student values(4,'王芳','女','1998-04-04');
2.2.2创建物化视图:
create materialized view mv_student_excellentrefresh with primary key start with sysdate next sysdate + 1 asselect * from student;
2.2.3对物化视图进行查询:
select * from mv_student_excellent; 2.2.4从物化视图修改数据: update mv_student_excellent set sex=‘女’ where id=7; 发现执行失败,不能通过物化视图直接使用update修改数据: 2.2.5修改物化视图:alter materialized view mv_student_excellent enable query rewrite;alter materialized view mv_student_excellent refresh complete;
2.2.6在使用快速刷新之前先创建物化视图日志:
create materialized view log on student with primary key;
2.2.7更新物化视图:
refresh materialized view mv_student_excellent fast ;
2.2.8删除物化视图以及物化视图日志:
drop materialized view mv_student_excellent;drop materialized view log on student;
为了提高系统的查询效率,DM 系统提供了索引,DM支持普通B树索引、聚集索引、分区索引、唯一索引、位图索引、位图连接索引、全文索引以及函数索引等.
3.1普通B树索引 3.1.1建student表并插入数据:create table student( id int primary key not null, name varchar(15) not null, sex char(2) check(sex in('男','女')) not null, birth date not null);insert into student values(1,'张三','男','1998-01-01');insert into student values(2,'李四','男','1998-02-02');insert into student values(3,'王五','男','1998-03-03');insert into student values(4,'王芳','女','1998-04-04');
3.1.2在student表中id列建普通B树索引:
create index ind_id on student(id);
3.1.3查看索引信息:
select index_name,table_name,index_type,status from user_indexes where table_name='STUDENT';3.1.4删除普通索引:
drop index ind_id ;
3.2唯一索引,位图索引,空间索引,聚簇索引
这些索引创建的方法与普通B树索引大体一致,只用在创建时使用不同的指定类型词就可以创建不同的索引: • UNIQUE 指明该索引为唯一索引; • BITMAP 指明该索引为位图索引; • SPATIAL 指明该索引为空间索引; • CLUSTER 指明该索引为聚簇索引(也叫聚集索引)3.3位图连接索引
位图连接索引是一种通过连接实现提高海量数据查询效率的有效方式,主要用于数据仓库环境中。它是针对两个或者多个表连接的位图索引,同时保存了连接的位图结果。对于列中的每一个值,该索引保存了索引表中对应行的 ROWID。 3.3.1创建teacher表和course表测试位图连接索引:create table teacher( tno int primary key, tname varchar(10) not null, tsex char(2) check(tsex in('男','女')) not null);insert into teacher values(1,'张三','男');insert into teacher values(2,'李四','男');insert into teacher values(3,'王芳','女');create table course( cno int not null, cname varchar(20) not null, c_tno int not null, foreign key (c_tno) references SYSDBA.TEACHER(tno));insert into course values(1,'语文',2);insert into course values(2,'数学',3);insert into course values(3,'英语',1);
3.3.2在teacher表和course表间创建位图连接索引:
create bitmap index ind_tname on course(tname)from teacher,coursewhere teacher.tno=course.c_tno;
3.4函数索引
3.4.1建表并插入数据:create table t1( name varchar(15), sex char(2), c1 int, c2 int, c3 int);insert into t1 values('zhangsan','男',1,6,5);insert into t1 values('zhangsan','男',2,6,5);insert into t1 values('zhangsan','男',19,6,5);insert into t1 values('zhangsan','男',14,6,5);insert into t1 values('zhangsan','男',13,6,5);
3.4.2创建函数索引:
create index cout on t1(c1+c2+c3);
DM 是一个具有主动特征的数据库管理系统,通过触发器机制,用户可以定义、删除和修改触发器。触发器(TRIGGER)定义为当某些与数据库有关的事件发生时,数据库应该采取的操作。DM支持BEFORE触发器、AFTER触发器、INSTEAD OF触发器、DDL事件触发器、系统事件触发器等
4.1BEFORE触发器,AFTER触发器,INSTEAD OF触发器 BEFORE 指明触发器在执行触发语句之前激发; AFTER 指明触发器在执行触发语句之后激发; INSTEAD OF 指明触发器执行时替换原始操作; 这三种触发器创建方式一致. 4.1.1创建表test并插入数据:create table test( id int, c1 int ); insert into test values(1,2); insert into test values(2,7);
4.1.2创建message表存储触发器触发信息:
create table message( id int identity(1,1), mes varchar(50));
4.1.3在表test上创建before触发器在修改操作之前触发:
create trigger tribefore update on test begin insert into message values('执行修改操作'); end;
4.1.4执行修改操作,查询message表中信息检验before触发器触发:
update test set c1=8 where id=2;select * from message;
可以在message表中查询到相应触发器触发的信息:
4.2DDL触发器 在DDL触发器中也可以使用BEFORE,AFTER,INSTEAD OF 来指定触发触发的时间,可以是 DDL 或 CREATE、ALTER、DROP、GRANT、REVOKE、TRUNCATE、COMMENT 等 4.2.1创建表test2测试DDL触发器:create table test2( objecttype varchar(100), objectname varchar(100));
4.2.2创建DDL触发器:
create trigger test2_tri before create on databasebegin insert into test2 values(:eventinfo.objecttype,:eventinfo.objectname);end;
4.2.3使用create语句:
create table a(c1 int);create view test2_view as select * from test2;create index test2_index on test2(objectname);
4.2.4查询test2中的数据查看触发器触发情况:
select * from test2;
4.3系统事件触发器
系统事件包括登入,登出等,也可以使用BEFORE,AFTER,INSTEAD OF来指定触发器触发的时间. 4.3.1创建系统事件触发器:create trigger tri_login after login on database begin insert into message values('SUCCESS'); end;
4.3.2登录数据库后查看message表中的信息:
select * from message;
查询到相应触发器触发的信息:
转载地址:http://klmen.baihongyu.com/