zoukankan      html  css  js  c++  java
  • pk+uk+fk+index

    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。

  • 相关阅读:
    浙江大华2012笔试题+答案解析
    腾讯2011年10月15日校招笔试+答案解析
    百度2011招聘笔试题+答案解析
    阿里巴巴2011笔试题+答案解析
    微软2012实习生笔试题+答案解析
    腾讯2012实习生笔试题+答案解析
    迅雷2012春招+答案解析
    华为2012春上机笔试题+参考程序
    中兴2011笔试题+答案解析
    mysql修改数据库名
  • 原文地址:https://www.cnblogs.com/BradMiller/p/1890915.html
Copyright © 2011-2022 走看看