赞
踩
使用FlyWay
进行Oracle
数据库表、索引、序列、触发器等管理时,往往为了避免多次执行导致额外创建
等意外情况发生,一般都会进行索引
、数据表
、序列
等 是否存在的判断
。
下面总结几种最常见的判断方式,以及说明常用的几个Oracle 系统视图
。
user_all_tables
一般用来记录该用户默认表空间下所有的表段和索引段上的表或视图的名称、段的类型、表空间名称等。
select * from user_all_tables;
执行后,可以发现能够展示当前数据库中的所有表名
、表大小
、表所属空间
、状态
、设置项
等。
如果需要使用到FlyWay
进行动态的建表
,可以根据此视图进行判断。
案例如下所示:
declare
cnt integer;
begin
select count(0)
into cnt
from user_all_tables
where table_name = upper('user_test');
if cnt = 0 then
execute immediate 'create table user_test
(
id INTEGER not null,
user_name varchar2(144),
age INTEGER
)';
end if;
execute immediate 'comment on table user_test is ''用户测试表''';
execute immediate 'comment on table user_test.id is ''主键编号''';
execute immediate 'comment on table user_test.user_name is ''用户名称''';
execute immediate 'comment on table user_test.age is ''用户年龄''';
end;
user_tab_columns
一般用来记录该用户下的数据表的列信息。
这里是
列
信息!
select * from user_tab_columns ;
执行后,就能查看出对应的所有表的表名
、列名
、列的类型
等。
如果涉及到针对某个表增加/删除/修改字段信息时,可以使用到这个系统视图。如下所示:
declare
cnt integer;
begin
select count(0)
into cnt
from user_tab_columns a
where a.Table_name = upper('user_test')
and a.COLUMN_NAME = upper('mail');
if cnt = 0 then
execute immediate 'ALTER TABLE user_test ADD mail VARCHAR2(32)';
execute immediate 'comment on column user_test.mail is ''邮箱''';
end if;
end;
user_constraints
描述了所有的当前用户的所拥有的表的所有约束
定义。
可以通过该视图,查询表的主键、外键等信息
select * from user_constraints;
执行后,可以查询到owner 所属空间
、constraint_name 约束名
、constraint_type 约束类型
等信息。
关于Oracle
的 Constraint_type
约束类型取值,可以参考下面文章:
使用FlyWay
动态判断并增加/修改约束案例如下所示:
declare
cnt integer;
begin
select count(0)
into cnt
from user_constraints a
where a.constraint_name = upper('user_test_id_PK');
if cnt = 0 then
execute immediate 'alter table user_test add constraint user_test_id_PK primary key (id)';
end if;
end;
/
user_sequences
用来管理当前数据库中所有的数据表
的序列
信息。通过下列命令可以查询相关信息:
select * from user_sequences;
执行后,可以获取到序列名
、最小值
、最大值
、递增值
、当前最新序列值
等信息。
如果需要FlyWay
对序列
进行维护管理,则可以采取如下方式新增序列:
declare
cnt integer;
begin
select count(0)
into cnt
from user_sequences
where sequence_name = upper('user_test_id_SEQ');
if cnt = 0 then
execute immediate 'create sequence user_test_id_SEQ
minvalue 1
maxvalue 9999999999999999999999999999
start with 1
increment by 1
cache 20';
end if;
end;
/
比如创建一个索引:
--创建索引
CREATE [UNIQUE] INDEX <索引名>
ON <基本表名> (<列名> [<次序>],[,<列名> [<次序>]]…);
--说明:
--UNIQUE:规定索引的每一个索引值只对应于表中的唯一记录。
--<次序>:建立索引时指定列名的索引表是ASC(升序)或DESC(降序)。
常见的操作有如下几种:
--索引的创建语句(简洁)
create index 索引名 on 表名(列名);
--标准语法
create index 索引名 on 表名(列名) tablespace 表空间名;
--tablespace 表空间名 可以省略,以下皆省略
--创建唯一索引
create unique index 索引名 on 表名(列名);
--复合索引/组合索引
create index 索引名 on 表名(列名1, 列名2, 列名3, ...);
--反向键索引
create index 索引名 on 表名(列名) reverse;
--删除索引
drop index 索引名 on 表名;
--降序索引
CREATE INDEX 索引名 ON 表名(列名 desc) ; --升序asc
--查看某个表中的所有索引
select * from all_indexes where table_name = '表名'
--查看某个表中建立了索引的所有列
select * from all_ind_columns where table_name = '表名'
上面说的是Oracle的相关操作,并不是说其他数据库就不可行,MySQL中也有一个information_schema
全局数据库信息表,其中有多个视图
。
这里不做太多说明,只展示几个常见的查询:
-- 查询数据库是否存在
select * from information_schema.SCHEMATA;
-- 表是否存在
select * from information_schema.TABLES where TABLE_SCHEMA ='test2' ;
-- 列
select * from information_schema.`COLUMNS` where TABLE_SCHEMA ='test2' and TABLE_NAME ='user';
-- 触发器
select * from information_schema.TRIGGERS t ;
-- 约束
select * from information_schema.KEY_COLUMN_USAGE kcu ;
-- 索引
select * from information_schema.STATISTICS s ;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。