1.pk
數(shù)據(jù)庫表分為實體表和關(guān)系表。
實體表是用來描述在domain(領(lǐng)域模型)里確實存在的實體(人、財、物、時間、空間)及實體元素發(fā)生的活動(轉(zhuǎn)移)。實體表的pk一般由系統(tǒng)自動生成(SYS_GUID()和sequence)。
關(guān)系表是用來描述兩張實體表之間的多對多關(guān)系,關(guān)系表的pk一般是兩張實體表pk的聯(lián)合,此pk同時具有uk的功能,所以關(guān)系表不用再建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%');
--創(chuàng)建pk
alter table yj_dcjxdy add constraint pk_yj_dcjxdy primary key (id);
2.uk
重復(fù)記錄的發(fā)生:在數(shù)據(jù)庫設(shè)計之初就考慮給每張表建UK,一般是不會出現(xiàn)重復(fù)記錄的情況,重復(fù)記錄的發(fā)生主要是因為uk缺失導(dǎo)致的。
uk在后期的調(diào)整大多是增加屬性,此時不會出現(xiàn)重復(fù)記錄的情況;當(dāng)uk的調(diào)整是減少屬性是,可能出現(xiàn)重復(fù)記錄。
--查詢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_%');
--刪除重復(fù)記錄
delete from yj_dcjxdy e where e.rowid > (select min(x.rowid) from yj_dcjxdy x where x.dcgid = e.dcgid);
--創(chuàng)建uk
create unique index UK_yj_dcjxdy on yj_dcjxdy (dcgid);
3.fk+index
fk是用來描述兩張實體表之間的一對多關(guān)系(兩張實體表之間一般不存在一對一的關(guān)系,如果有一對一的兩張實體表,完全可以合并成一張實體表)。
fk與pk的區(qū)別在于,oracle自動給pk建索引,但默認(rèn)不給fk建索引。
fk不建索引的后果是:在多表級聯(lián)查詢時,沒有索引,將觸發(fā)全表掃描,在數(shù)據(jù)量大的情況下,會慢的一塌糊涂。
--查詢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;
--創(chuàng)建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字節(jié));
其中trigger還有另外一個限制,trigger的名稱存放在obj$.name中;
trigger的內(nèi)容作為匿名塊存放在trigger$.action#(long類型 32MB 32760B)中,
即trigger的長度不能超過32760B。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
