检查外键列是否是索引列的两个语句

本文介绍了如何通过SQL查询语句检查Oracle数据库中外键列是否为索引列,包括基本查询方法和利用新特性Listagg分析函数的高级查询方法。通过实验证明了查询的有效性和局限性,并提供了测试表创建示例。

本文摘自《oracle 索引技术》 第37页和第38页

 

检查外键列是否是索引列的语句之一:

select distinct
a.owner  owner,
a.constraint_name cons_name,
a.table_name tab_name,
b.column_name  cons_column,
nvl(c.column_name,'***Check index***') ind_column
from dba_constraints a,
     dba_cons_columns b,
     dba_ind_columns c
where constraint_type='R'
and   a.owner=upper('&user_name')
and   a.owner=b.owner
and   a.constraint_name=b.constraint_name
and   b.column_name=c.column_name(+)
and   b.table_name=c.table_name(+)
and   b.position=c.column_position(+)
order by tab_name, ind_column;



以上查询语句并不能在所有情况下都正确的报告出未索引的外键。
比如,在多列外键的情况下,以不同于索引列的书序定义约束也不要紧,只要索引列在该索引中位于前面即可。

 


检查外键列是否是索引列的语句之二:--使用listagg分析函数(该函数是11g新特性)

select 
case when ind.index_name is not null then
  case when ind.index_type in ('BITMAP') then
    '** Bitmp idx **'
  else
    'indexed'
  end
else
  '** Check idx **'
end checker,
ind.index_type,cons.owner,cons.table_name, ind.index_name,cons.constraint_name,cons.cols
from 
(
select c.owner,c.table_name,c.constraint_name,listagg(cc.column_name,',') within group (order by cc.column_name) cols
from dba_constraints c, dba_cons_columns cc
where c.owner=cc.owner
and c.owner=upper('&schema')
and c.constraint_name=cc.constraint_name
and c.constraint_type='R'
group by c.owner,c.table_name,c.constraint_name
) cons
left outer join
(
select table_owner,table_name,index_name,index_type,cbr,listagg(column_name,',') within group (order by column_name) cols
 from
  (select ic.table_owner,ic.table_name,ic.index_name,ic.column_name,
          ic.column_position,i.index_type,connect_by_root(ic.column_name) cbr
   from dba_ind_columns ic,
        dba_indexes i
   where ic.table_owner=upper('&schema')
    and  ic.table_owner=i.table_owner
    and  ic.table_name=i.table_name
    and  ic.index_name=i.index_name
    connect by prior ic.column_position-1=ic.column_position
    and prior ic.index_name=ic.index_name )
 group by table_owner,table_name,index_name,index_type,cbr ) ind
on cons.cols=ind.cols
and cons.table_name=ind.table_name
and cons.owner=ind.table_owner
order by checker,cons.owner,cons.table_name;



建立如下的测试表:

 create table TEST_USER.students(stud_id number constraint pk_stud_id primary key,lname varchar2(40),fname varchar2(40));
  
  create table TEST_USER.attendees
  (stud_id number,
  class_id number,
  constraint pk_attendees primary key (stud_id,class_id)
   );
   
   alter table TEST_USER.attendees add constraint fk_stud foreign key (stud_id) references TEST_USER.students(stud_id);


 

执行第一个脚本,输出如下:

 

执行第二个脚本,输出如下:

 

 

## 软件功能详细介绍 1. **文本片段管理**:可以添加、编辑、删除常用文本片段,方便快速调用 2. **分组管理**:支持创建多个分组,不同类型的文本片段可以分类存储 3. **热绑定**:为每个文本片段绑定自定义热,实现一粘贴 4. **窗口置顶**:支持窗口置顶功能,方便在其他应用程序上直接使用 5. **自动隐藏**:可以设置自动隐藏,减少桌面占用空间 6. **数据持久化**:所有配置和文本片段会自动保存,下次启动时自动加载 ## 软件使用技巧说明 1. **快速添加文本**:在文本输入框中输入内容后,点击"添加内容"按钮即可快速添加 2. **批量管理**:可以同时编辑多个文本片段,提高管理效率 3. **热冲突处理**:如果设置的热与系统其他软件冲突,会自动提示 4. **分组切换**:使用分组按钮可以快速切换不同类别的文本片段 5. **文本格式化**:支持在文本片段中使用换行符和制表符等格式 ## 软件操作方法指南 1. **启动软件**:双击"大飞哥软件自习室——快捷粘贴工具.exe"文件即可启动 2. **添加文本片段**: - 在主界面的文本输入框中输入要保存的内容 - 点击"添加内容"按钮 - 在弹出的对话框中设置热和分组 - 点击"确定"保存 3. **使用热粘贴**: - 确保软件处于运行状态 - 在需要粘贴的位置按下设置的热 - 文本片段会自动粘贴到当前位置 4. **编辑文本片段**: - 选中要编辑的文本片段 - 点击"编辑"按钮 - 修改内容设置 - 点击"确定"保存修改 5. **删除文本片段**: - 选中要删除的文本片段 - 点击"删除"按钮 - 在确认对话框中点击"确定"即可删除
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值