1.pk
数据库表分为实体表和关系表。
实体表是用来描述在domain(领域模型)里确实存在的实体(人、财、物、时间、空间)及实体元素发生的活动(转移)。实体表的pk一般由系统自动生成(SYS_GUID()和sequence)。
关系表是用来描述两张实体表之间的多对多关系,关系表的pk一般是两张实体表pk的联合,此pk同时具有uk的功能,所以关系表不用再建uk。
--查询pk缺失的表
select table_name from user_tables t where not exists (select 1 from user_indexes i where i.table_name=t.table_name and uniqueness='UNIQUE' and index_name like '%PK%');
--创建pk
alter table yj_dcjxdy add constraint pk_yj_dcjxdy primary key (id);
2.uk
重复记录的发生:在数据库设计之初就考虑给每张表建UK,一般是不会出现重复记录的情况,重复记录的发生主要是因为uk缺失导致的。
uk在后期的调整大多是增加属性,此时不会出现重复记录的情况;当uk的调整是减少属性是,可能出现重复记录。
--查询uk缺失的表
select table_name from user_tables t where not exists (select 1 from user_indexes i where i.table_name=t.table_name and uniqueness='UNIQUE' and index_name like 'UK_%');
--删除重复记录
delete from yj_dcjxdy e where e.rowid > (select min(x.rowid) from yj_dcjxdy x where x.dcgid = e.dcgid);
--创建uk
create unique index UK_yj_dcjxdy on yj_dcjxdy (dcgid);
3.fk+index
fk是用来描述两张实体表之间的一对多关系(两张实体表之间一般不存在一对一的关系,如果有一对一的两张实体表,完全可以合并成一张实体表)。
fk与pk的区别在于,oracle自动给pk建索引,但默认不给fk建索引。
fk不建索引的后果是:在多表级联查询时,没有索引,将触发全表扫描,在数据量大的情况下,会慢的一塌糊涂。
--查询fk没有建index的情况
select table_name, constraint_name,
cname1 || nvl2(cname2,','||cname2,null) ||nvl2(cname3,','||cname3,null) || nvl2(cname4,','||cname4,null) ||nvl2(cname5,','||cname5,null) || nvl2(cname6,','||cname6,null) ||nvl2(cname7,','||cname7,null) || nvl2(cname8,','||cname8,null) columns
from (select b.table_name, b.constraint_name, max(decode( position, 1, column_name, null )) cname1, max(decode( position, 2, column_name, null )) cname2,
max(decode( position, 3, column_name, null )) cname3, max(decode( position, 4, column_name, null )) cname4, max(decode( position, 5, column_name, null )) cname5, max(decode( position, 6, column_name, null )) cname6,
max(decode( position, 7, column_name, null )) cname7, max(decode( position, 8, column_name, null )) cname8, count(*) col_cnt
from (select substr(table_name,1,30) table_name,substr(constraint_name,1,30) constraint_name,substr(column_name,1,30) column_name,position from user_cons_columns ) a,
user_constraints b
where a.constraint_name = b.constraint_name and b.constraint_type = 'R' group by b.table_name, b.constraint_name
) cons
where col_cnt > ALL
(select count(*)
from user_ind_columns i
where i.table_name = cons.table_name and i.column_name in (cname1, cname2, cname3, cname4, cname5, cname6, cname7, cname8 )
and i.column_position <= cons.col_cnt
group by i.index_name
) order by table_name;
--创建index
create index idx_xt_yh_szbm on xt_yh (szbm);
4.引用
select * from user_constraints 约束表
select * from user_cons_columns 约束引用列表 position 列在约束中的位置
select * from user_indexes order by uniqueness,index_name 索引表
select * from user_ind_columns 索引引用列表 column_position 列在索引中的位置
select * from user_tables order by table_name 物理表
select * from user_segments 物理表和索引表
segment是指可增长的对象,如:表、索引;
其余的像 procedure、package、package body、type、type body、function、trigger都是不可增加对象,
按行存贮在source$的source varchar2(4000)属性中(即每行不能超多4000字节);
其中trigger还有另外一个限制,trigger的名称存放在obj$.name中;
trigger的内容作为匿名块存放在trigger$.action#(long类型 32MB 32760B)中,
即trigger的长度不能超过32760B。