Create Or Replace FUNCTION MATCHFOREIGNKEYINDEX( i_constraint_name In varchar , i_owner In varchar default null )
return varchar2
is
FK_owner varchar2(100); -- 外键的拥有者
Fk_table_name varchar2(200); -- 外键作用的表名字
index_name varchar2(200) := ''; -- 和外键匹配的索引名字
index_number Integer := 0; -- 可以匹配上的索引数量
begin
-- 如果没有传入用户名,以当前登录用户作为用户名
If ( i_owner is null ) then
SELECT SYS_CONTEXT ('USERENV', 'CURRENT_USER') CURRENT_USER
INTO FK_owner
FROM DUAL;
else
FK_owner := i_owner;
end if;
-- 检查这个约束是不是存在,是不是外键
Select owner, table_name
into Fk_owner, Fk_table_name
from all_constraints
where constraint_type='R'
and constraint_name= i_constraint_name
and owner = FK_owner;
-- 如果没有找到这条 外键约束,报异常
If (SQL%NOTFOUND)
Then
RAISE_APPLICATION_ERROR(-20001, 'Not Found this constraint');
end if;
-- 找到了这条外键约束,直接和索引进行匹配
-- 首先确定Constraint和Index都是作用在一张表上的
-- Constraint Table Name = Index Table Name
-- Constraint Table Owner = Index Table Owner
-- Constraint Owner = 传入值
-- Index Owner : 可以任意(这里就不检查Constraint Owner是否可以读写了)
-- 在Constraint Column中有的字段、顺序要一样
SELECT count( distinct index_name )
Into index_number
FROM all_cons_columns acc, all_ind_columns aic
WHERE
acc.owner = aic.table_owner
and acc.table_name = aic.table_name
AND acc.column_name = aic.column_name
AND acc.POSITION = aic.column_position
AND acc.owner = fk_owner
and acc.constraint_name = i_constraint_name;
Case index_number
When 0 then
index_name := '';
When 1 then
SELECT distinct index_name
Into index_name
FROM all_cons_columns acc, all_ind_columns aic
WHERE
acc.owner = aic.table_owner
and acc.table_name = aic.table_name
AND acc.column_name = aic.column_name
AND acc.POSITION = aic.column_position
AND acc.owner = fk_owner
and acc.constraint_name = i_constraint_name;
Else
index_name := '有多项' || to_char(index_number) ;
End Case;
return (index_name);
End;
分享到:
相关推荐
这个过程通常涉及删除数据库中的所有表、存储过程、主键、外键以及索引等对象。下面我们将详细探讨这些概念及其在数据库中的作用,以及如何安全有效地执行删除操作。 首先,让我们逐一了解这些数据库元素: 1. 表...
删除数据库的所有表、存储过程、主键、外键、索引等 .sql
另附以下功能 * 生成目录树 * 生成迁移脚本 * 查找所有System.out,.err * 批量替换多关键字 详情见 http://blog.csdn.net/amosryan/article/details/6684465
sql学习 主外键设计1_外键索引与性能.sql
sql学习 主外键设计2_外键索引与锁.sql
在示例中,创建了名为`ind_pk_object_id`的索引后,死锁的情况得到了解决,因为现在删除父表记录时的检查变得高效,不再需要表级锁。 创建索引对于避免死锁至关重要,但同时需要注意,索引会占用额外的存储空间,并...
在数据库管理系统中,外键是用来建立和加强两个表数据之间链接的一类约束。在MySQL数据库中,可以通过特定的语法结构来增加外键,即便在建表时未设置外键也能在之后进行添加。本文详细介绍了在MySQL中增加外键的方法...
sql学习 监控哪些外键未建索引.sql
在创建外键时,要求父表必须有对应的索引,子表在创建外键时也会自动创建对应的索引。在创建索引时,可以指定在删除、更新父表时,对子表进行的相应操作,包括 RESTRICT、NO ACTION、SET NULL 和 CASCADE。其中 ...
sql学习 哪些表的外键未建索引.sql
其中,字段约束、索引、视图和外键是常用的几个重要概念。本文档将围绕MySQL中这些高级特性的学习实践进行详细探讨。 首先,字段约束是数据库中对字段应该满足的规则的一种描述。它用于保证数据库中数据的完整性和...
本教程主要探讨MySQL中的四大核心高级特性:字段约束、索引、视图和外键。这四个概念是数据库设计和管理的基础,对于提升数据库性能和确保数据完整性至关重要。 ### 字段约束 字段约束是定义数据库表结构时用来限制...
### Java 获取 MySQL 数据库主外键详解 在Java开发中,有时我们需要动态地获取数据库的元数据信息,比如表结构、主键、外键等。本文将详细介绍如何使用Eclipse和JDBC API来获取MySQL数据库中的表结构以及主外键信息...
`WHERE COL_CNT > ALL`子句比较当前外键列的数量与对应的索引列数量,如果外键列有索引,那么其数量应小于等于索引列数量。 如果只需要查询特定用户的外键是否有索引,可以稍作修改,例如只针对用户`SCOTT`: ```...
成绩表中的学号虽然不是成绩表的主键,但它与学生表中的学号相对应,并且学生表中的学号是学生表的主键,这时成绩表中的学号就是学生表的外键。同理,成绩表中的课程号是课程表的外键。 #### 二、主键、外键和索引...
根据提供的标题、描述以及部分代码内容,我们可以了解到这篇文章主要探讨的是如何在Oracle数据库中查询所有用户表的相关信息,包括表名、主键名称、索引、外键等元数据信息。接下来,我们将对这些知识点进行详细的...
### 获取SQL外键集合知识点详解 #### 一、概述 在数据库设计中,外键(Foreign Key)是一种用于建立表间关系的重要机制。通过定义一个表中的列与另一个表中的主键之间的链接,可以实现数据的一致性和完整性。在...
需求是这样的,一个资源表有分类r_class_id(分类表id对应的外键) 创建者r_up_creator(用户表id对应的外键) 审核者r_ver_id (用户表id对应的外键),这时候该怎么将其都查询出来呢? 首先用左连接: select ...
MySQL 外键