Oracle系统中表外键的更名

2016-02-19 17:22 4 1 收藏

get新技能是需要付出行动的,即使看得再多也还是要动手试一试。今天图老师小编跟大家分享的是Oracle系统中表外键的更名,一起来学习了解下吧!

【 tulaoshi.com - 编程语言 】

  Oracle中表的外键是保证系统参照完整性的手段,而参照完整性是指分布在两个表中的列所满足的具有主从性质的约束关系。外键涉及到两个表,其中一个称之为父项表,另一个称之为子项表。

  父项表(parent table)是参照约束的基础,即通过检查这张表的有效数据情况来判断约束是否成立,它是参照约束的条件,影响约束,而不受约束的任何影响。

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  子项表(child table)是参照约束的对象,当其发生变化,如有新数据输入时,通过比较父项表中的有效数据状况,来判断这些变化是否符合约束条件,若不符合,则拒绝要发生的变化。

  在实际应用系统中,开发者为了保证系统的完整性,一般要定义大量的外键。然而,如果外键的命名不规范,如采用系统自动生成的名称,则在以后的系统运行维护中会造成很大的麻烦。如在系统运行后,加载大量数据或者进行一些数据转换操作等时,出现外键错误时,根据系统提示的外键错误,根本不可能直接定位到那两个表间的外键发生错误,需要浪费很多时间查找造成错误发生的外键的父项表和子项表,然后才能进一步确定是那条记录违反了外键约束条件。通常,我们采用这样的命名规则来命名外键FK_Child_table name_Parent_table name。由于外键名称的最大长度限制在30个字符之内,对child_table_name和Parent_table name不一定和原表一模一样,可以采取一些简写的办法,但名称一定要能反映出约束的两个表。这里的命名,Child_table name指子项表,也就是约束表,Parent_table name是指父项表,也就是被约束的表。

  下面来详细讨论如何将应用系统中不规范的外键命名修改为规范的外键名称。在讨论之前,需要提醒读者注意的是,完成下面的操作需要花费较长的时间,所以一定要规划在系统空闲时来完成。同时这里的外键更名,采用的方法是首先删除然后重建,涉及到删除应用系统对象的操作,所以在操作之前,为安全起见,应该备份应用系统。

  一、生成系统目前的外键报告单

  首先生成系统目前模式下的所有外键情况报告单,SQL脚本如下:

  

******************************************************************************脚本1:列出当前模式下所有外键的报告表,可以将其spool到某个文件中******************************************************************************/SELECT RPAD(child.TABLE_NAME,25,' ') Child_Tablename,RPAD(cp.COLUMN_NAME,17,' ') Referring_Column,RPAD(parent.TABLE_NAME,25,' ') Parent_Tablename,RPAD(pc.COLUMN_NAME,15,' ') Referred_Column,RPAD(child.CONSTRAINT_NAME,25,' ') Constraint_NameFROM USER_CONSTRAINTS child,USER_CONSTRAINTS parent,USER_CONS_COLUMNS cp,USER_CONS_COLUMNS pcWHERE child.CONSTRAINT_TYPE = 'R' ANDchild.R_CONSTRAINT_NAME = PARENT.CONSTRAINT_NAME ANDchild.CONSTRAINT_NAME = cp.CONSTRAINT_NAME ANDparent.CONSTRAINT_NAME = pc.CONSTRAINT_NAME ANDcp.POSITION = pc.POSITIONORDER BY child.OWNER,child.TABLE_NAME,child.CONSTRAINT_NAME,cp.POSITION; 

  该脚本生成所在模式下的所有外键情况,包括外键名称,父项表名称,子项表名称以及引用的列名称等。在SQL/PLUS下运行该脚本,在运行该脚本之前,可以将输出SPOOL到本地某个文件中。同时要注意,如果应用系统中的外键比较多且复杂的话,这个脚本的运行时间会比较长。

  二、生成删除系统自动命名的外键脚本

  在SQL/PLUS下,运行下面的脚本来生成删除系统自动命名(也就是外键名称以SYS为前缀)的所有外键,和生成外键报告一样,将生成脚本spool到某个文件中。

  

******************************************************************************脚本2:删除系统自动生成的外键约束条件******************************************************************************/SELECT 'ALTER TABLE ' || TABLE_NAME ||' '||'DROP CONSTRAINT ' || CONSTRAINT_NAME || ' ;'FROM USER_CONSTRAINTSWHERE CONSTRAINT_NAME LIKE 'SYS%' ANDCONSTRAINT_TYPE = 'R'; 

  运行该脚本,系统生成如下所示的删除外键脚本:

  

ALTER TABLE DJ_NSRXX DROP CONSTRAINT SYS_C000231;

  三、生成重新创建删除的外键脚本

  在SQL/PLUS下,运行下面的脚本来生成重新创建删除的外键脚本:

  

******************************************************************************脚本3:重新创建外键******************************************************************************/SELECT 'ALTER TABLE ' || child.TABLE_NAME||' ' ||'ADD CONSTRAINT ' || '外键名称 ' ||' '||'FOREIGN KEY ' || '('|| cp.COLUMN_NAME || ')' ||' '|| 'REFERENCES ' || parent.TABLE_NAME ||' '||'('|| pc.COLUMN_NAME || ')'|| child.DELETE_RULE || ' ;'FROM USER_CONSTRAINTS child,USER_CONSTRAINTS parent,USER_CONS_COLUMNS cp,USER_CONS_COLUMNS pcWHERE child.CONSTRAINT_TYPE = 'R' ANDchild.R_OWNER = PARENT.OWNER ANDchild.R_CONSTRAINT_NAME = PARENT.CONSTRAINT_NAME ANDchild.CONSTRAINT_NAME = cp.CONSTRAINT_NAME ANDparent.CONSTRAINT_NAME = pc.CONSTRAINT_NAME ANDcp.POSITION = pc.POSITION ANDchild.CONSTRAINT_NAME LIKE 'SYS%'ORDER BY child.OWNER,child.TABLE_NAME,child.CONSTRAINT_NAME,cp.POSITION; 

  运行该脚本,系统生成如下所示的创建外键脚本:

  ALTER TABLE DJ_NSRXX ADD CONSTRAINT 外键名称 FOREIGN KEY (RYDM) REFERENCES DM_GY_SWRY(RYDM);

  将上面的外键名称以上面介绍的规范命名规则命名的外键名称代替,就是

  

ALTER TABLE DJ_NSRXX ADD CONSTRAINT FK_DJ_NSRXX_DM_GY_SWRY FOREIGN KEY (RYDM) REFERENCES DM_GY_SWRY(RYDM); 

  四、外键更名

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  生成上面的两个脚本后,首先运行第二步中删除系统自动生成外键的脚本,将系统中命名不规范的外键删除,然后运行第三步中生成的创建外键的脚本,重新创建这些删除的外键,也就实现了对不规范外键的更名。

  五、系统检查

  操作完成后,重新执行步骤1,再生成一个应用系统的外键报告单,作对比检查。如果正确无误,则更名成功,否则查找原因。

来源:https://www.tulaoshi.com/n/20160219/1615047.html

延伸阅读
标签: SQLServer
--第一步:查看是否需要维护,查看扫描密度/Scan Density是否为100% declare @table_id int set @table_id=object_id(表名) dbcc showcontig(@table_id) --第二步:重构表索引 dbcc dbreindex(表名,pk_索引名,100) --重做第一步,如发现扫描密度/Scan Density还是小于100%则重构表的所有索引 --杨铮:并不一定能达100%。 dbcc dbreindex(表...
粗略来讲,系统调整一般反映在下列方面: Shared Pool and Library Cache Performance Tuning(共享池和Library Cache):Oracle将SQL语句、存储包、对象信息和很多其他的项目保存在SGA中一个叫共享池(shared pool)的地方。这个可共享的区域由一个成熟的高速缓存和堆管理器管理。它有3个基本的问题要克服: 内存分配的单元不是...
标签: windows 操作系统
在PC键上有一个ALT键,与Shift、Ctrl键一样,一般情况下,我们都是将它与其它的键配合使用的,似乎作用不大。其实,细细想来,它在Windows中的作用可大着呢,不信,请看下文。相信看完本文后,您一定会对您键盘上的ALT键另眼相看了。 1、快速建立快捷方式 大家对Windows中的快捷方式并不陌生,通过快捷方式我们可以非常“快...
标签: flash教程
本文主要介绍在Flash中用鼠标模拟压感笔有粗细变化的笔触效果的方法。 我们知道,压感笔是专业图形设计师常用的一种辅助设计工具。设计师们可以利用它的压力感知功能用手轻松的描绘出笔画的粗细、色调的明暗以及色彩的强度。特别是笔画粗细不同的笔触效果,看起来自然而流畅,绘制出的各类形象个性鲜明、独具风格(见下图图解)。 在许...
标签: 电脑入门
Shift键只是我们107个键位中很普通的一个,大多数人对于它的了解,恐怕仅仅是输入法中切换大小写的那个东东。但其实它的功能绝非切换大小写那么简单,在我们的Windows 7中,Shift键被赋予了更多更神奇的功能。不信?那咱们就依次瞧一瞧吧。 1.超级发送到 发送到每天都用,一般情况下这个菜单只有寥寥可数的几个项目。但当我们按住Shift键,再...

经验教程

742

收藏

17
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部