📄 oracle实例-5.htm
字号:
<body bgcolor="#000000">
<FONT color="#006600"
class=title>Oracle系统中表外键的更名</FONT><font color="#FFFFFF"><BR>
<FONT class=content><BR>
<BR>
Oracle中表的外键是保证系统参照完整性的手段,而参照完整性是指分布在两个表中的列所满足的具有主从性质的约束关系。外键涉及到两个表,其中一个称之为父项表,另一个称之为子项表。
<BR>
<BR>
父项表(parent table)是参照约束的基础,即通过检查这张表的有效数据情况来判断约束是否成立,它是参照约束的条件,影响约束,而不受约束的任何影响。
<BR>
<BR>
子项表(child table)是参照约束的对象,当其发生变化,如有新数据输入时,通过比较父项表中的有效数据状况,来判断这些变化是否符合约束条件,若不符合,则拒绝要发生的变化。
<BR>
<BR>
在实际应用系统中,开发者为了保证系统的完整性,一般要定义大量的外键。然而,如果外键的命名不规范,如采用系统自动生成的名称,则在以后的系统运行维护中会造成很大的麻烦。如在系统运行后,加载大量数据或者进行一些数据转换操作等时,出现外键错误时,根据系统提示的外键错误,根本不可能直接定位到那两个表间的外键发生错误,需要浪费很多时间查找造成错误发生的外键的父项表和子项表,然后才能进一步确定是那条记录违反了外键约束条件。通常,我们采用这样的命名规则来命名外键FK_Child_table
name_Parent_table name。由于外键名称的最大长度限制在30个字符之内,对child_table_name和Parent_table name不一定和原表一模一样,可以采取一些简写的办法,但名称一定要能反映出约束的两个表。这里的命名,Child_table
name指子项表,也就是约束表,Parent_table name是指父项表,也就是被约束的表。 <BR>
<BR>
下面来详细讨论如何将应用系统中不规范的外键命名修改为规范的外键名称。在讨论之前,需要提醒读者注意的是,完成下面的操作需要花费较长的时间,所以一定要规划在系统空闲时来完成。同时这里的外键更名,采用的方法是首先删除然后重建,涉及到删除应用系统对象的操作,所以在操作之前,为安全起见,应该备份应用系统。
<BR>
<BR>
</FONT></font><FONT class=content>
<TABLE width="100%" bgColor=#f7f3f7>
<TBODY>
<TR>
<TD bgcolor="#CCCCCC"><FONT
color=#000000>一、生成系统目前的外键报告单</FONT></TD>
</TR>
</TBODY>
</TABLE>
<font color="#FFFFFF"><BR>
首先生成系统目前模式下的所有外键情况报告单,SQL脚本如下: <BR>
<BR>
</font>
<TABLE class=code cellSpacing=0 borderColorDark=#ffffff
cellPadding=0 width=580 borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6> <TABLE width="100%"
border=0 cellPadding=0 cellSpacing=0 bgcolor="#CCCCCC" class=code>
<TBODY>
<TR>
<TD
colSpan=2><font color="#000000">/******************************************************************************<BR>
脚本1:列出当前模式下所有外键的报告表,可以将其spool到某个文件中<BR>
******************************************************************************/</font></TD>
</TR>
<TR>
<TD vAlign=top width="12%"><font color="#000000">SELECT</font></TD>
<TD vAlign=top width="88%"><font color="#000000">RPAD(child.TABLE_NAME,25,'
') Child_Tablename,<BR>
RPAD(cp.COLUMN_NAME,17,' ') Referring_Column,<BR>
RPAD(parent.TABLE_NAME,25,' ') Parent_Tablename,<BR>
RPAD(pc.COLUMN_NAME,15,' ') Referred_Column,<BR>
RPAD(child.CONSTRAINT_NAME,25,' ') Constraint_Name</font></TD>
</TR>
<TR>
<TD vAlign=top width="12%"><font color="#000000">FROM</font></TD>
<TD width="88%" vAlign=top bgcolor="#CCCCCC"><font color="#000000">USER_CONSTRAINTS
child,<BR>
USER_CONSTRAINTS parent,<BR>
USER_CONS_COLUMNS cp,<BR>
USER_CONS_COLUMNS pc</font></TD>
</TR>
<TR>
<TD vAlign=top width="12%"><font color="#000000">WHERE</font></TD>
<TD vAlign=top width="88%"><font color="#000000">child.CONSTRAINT_TYPE
= 'R' AND<BR>
child.R_CONSTRAINT_NAME = PARENT.CONSTRAINT_NAME AND<BR>
child.CONSTRAINT_NAME = cp.CONSTRAINT_NAME AND<BR>
parent.CONSTRAINT_NAME = pc.CONSTRAINT_NAME AND<BR>
cp.POSITION = pc.POSITION</font></TD>
</TR>
<TR>
<TD vAlign=top width="12%"><font color="#000000">ORDER BY</font></TD>
<TD vAlign=top
width="88%"><font color="#000000">child.OWNER,<BR>
child.TABLE_NAME,<BR>
child.CONSTRAINT_NAME,<BR>
cp.POSITION;</font></TD>
</TR>
</TBODY>
</TABLE></TD>
</TR>
</TBODY>
</TABLE>
<font color="#FFFFFF"><BR>
该脚本生成所在模式下的所有外键情况,包括外键名称,父项表名称,子项表名称以及引用的列名称等。在SQL/PLUS下运行该脚本,在运行该脚本之前,可以将输出SPOOL到本地某个文件中。同时要注意,如果应用系统中的外键比较多且复杂的话,这个脚本的运行时间会比较长。
<BR>
<BR>
</font>
<TABLE width="100%" bgColor=#f7f3f7>
<TBODY>
<TR>
<TD bgcolor="#CCCCCC"><FONT
color=#000000>二、生成删除系统自动命名的外键脚本</FONT></TD>
</TR>
</TBODY>
</TABLE>
<font color="#FFFFFF"><BR>
在SQL/PLUS下,运行下面的脚本来生成删除系统自动命名(也就是外键名称以SYS为前缀)的所有外键,和生成外键报告一样,将生成脚本spool到某个文件中。
<BR>
<BR>
</font>
<TABLE class=code cellSpacing=0 borderColorDark=#ffffff
cellPadding=0 width=580 borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6> <TABLE width="100%"
border=0 cellPadding=0 cellSpacing=0 bgcolor="#CCCCCC" class=code>
<TBODY>
<TR>
<TD
colSpan=2><font color="#000000">/******************************************************************************<BR>
脚本2:删除系统自动生成的外键约束条件<BR>
******************************************************************************/</font></TD>
</TR>
<TR>
<TD vAlign=top width="12%"><font color="#000000">SELECT</font></TD>
<TD vAlign=top width="88%"><font color="#000000">'ALTER TABLE '
|| TABLE_NAME ||' '||<BR>
'DROP CONSTRAINT ' || CONSTRAINT_NAME || ' ;'</font></TD>
</TR>
<TR>
<TD width="12%" height="17" vAlign=top><font color="#000000">FROM</font></TD>
<TD vAlign=top width="88%"><font color="#000000">USER_CONSTRAINTS</font></TD>
</TR>
<TR>
<TD vAlign=top width="12%"><font color="#000000">WHERE</font></TD>
<TD width="88%" vAlign=top bgcolor="#CCCCCC"><font color="#000000">CONSTRAINT_NAME
LIKE 'SYS%' AND<BR>
CONSTRAINT_TYPE = 'R';</font></TD>
</TR>
</TBODY>
</TABLE></TD>
</TR>
</TBODY>
</TABLE>
<font color="#FFFFFF"><BR>
运行该脚本,系统生成如下所示的删除外键脚本: <BR>
<BR>
</font>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=0
width="100%" borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#CCCCCC><font color="#000000">ALTER TABLE DJ_NSRXX
DROP CONSTRAINT SYS_C000231;</font></TD>
</TR>
</TBODY>
</TABLE>
<font color="#FFFFFF"><BR>
</font>
<TABLE width="100%" bgColor=#f7f3f7>
<TBODY>
<TR>
<TD bgcolor="#CCCCCC"><FONT
color=#000000>三、生成重新创建删除的外键脚本</FONT></TD>
</TR>
</TBODY>
</TABLE>
<font color="#FFFFFF"><BR>
在SQL/PLUS下,运行下面的脚本来生成重新创建删除的外键脚本: <BR>
<BR>
</font>
<TABLE class=code cellSpacing=0 borderColorDark=#ffffff
cellPadding=0 width=580 borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6> <TABLE width="100%"
border=0 cellPadding=0 cellSpacing=0 bgcolor="#CCCCCC" class=code>
<TBODY>
<TR>
<TD
colSpan=2><font color="#000000">/******************************************************************************<BR>
脚本3:重新创建外键<BR>
******************************************************************************/</font></TD>
</TR>
<TR>
<TD vAlign=top width="12%"><font color="#000000">SELECT</font></TD>
<TD vAlign=top width="88%"><font color="#000000">'ALTER TABLE '
|| child.TABLE_NAME||' ' ||<BR>
'ADD CONSTRAINT ' || '外键名称 ' ||' '||<BR>
'FOREIGN KEY ' || '('|| cp.COLUMN_NAME || ')' ||<BR>
' '|| 'REFERENCES ' || parent.TABLE_NAME ||' '||<BR>
'('|| pc.COLUMN_NAME || ')'|| child.DELETE_RULE || ' ;'</font></TD>
</TR>
<TR>
<TD vAlign=top width="12%"><font color="#000000">FROM</font></TD>
<TD vAlign=top width="88%"><font color="#000000">USER_CONSTRAINTS
child,<BR>
USER_CONSTRAINTS parent,<BR>
USER_CONS_COLUMNS cp,<BR>
USER_CONS_COLUMNS pc</font></TD>
</TR>
<TR>
<TD vAlign=top width="12%"><font color="#000000">WHERE</font></TD>
<TD vAlign=top width="88%"><font color="#000000">child.CONSTRAINT_TYPE
= 'R' AND<BR>
child.R_OWNER = PARENT.OWNER AND<BR>
child.R_CONSTRAINT_NAME = PARENT.CONSTRAINT_NAME AND<BR>
child.CONSTRAINT_NAME = cp.CONSTRAINT_NAME AND<BR>
parent.CONSTRAINT_NAME = pc.CONSTRAINT_NAME AND<BR>
cp.POSITION = pc.POSITION AND<BR>
child.CONSTRAINT_NAME LIKE 'SYS%'</font></TD>
</TR>
<TR>
<TD vAlign=top width="12%"><font color="#000000">ORDER BY</font></TD>
<TD vAlign=top
width="88%"><font color="#000000">child.OWNER,<BR>
child.TABLE_NAME,<BR>
child.CONSTRAINT_NAME,<BR>
cp.POSITION;</font></TD>
</TR>
</TBODY>
</TABLE></TD>
</TR>
</TBODY>
</TABLE>
<font color="#FFFFFF"><BR>
运行该脚本,系统生成如下所示的创建外键脚本: <BR>
<BR>
</font>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=0
width="100%" borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#CCCCCC><font color="#000000">ALTER TABLE DJ_NSRXX
ADD CONSTRAINT 外键名称 FOREIGN KEY (RYDM) REFERENCES DM_GY_SWRY(RYDM); </font></TD>
</TR>
</TBODY>
</TABLE>
<font color="#FFFFFF"><BR>
将上面的外键名称以上面介绍的规范命名规则命名的外键名称代替,就是 <BR>
<BR>
</font>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=0
width="100%" borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#CCCCCC><font color="#000000">ALTER TABLE DJ_NSRXX
ADD CONSTRAINT FK_DJ_NSRXX_DM_GY_SWRY FOREIGN KEY (RYDM) REFERENCES DM_GY_SWRY(RYDM);
</font></TD>
</TR>
</TBODY>
</TABLE>
<font color="#FFFFFF"><BR>
</font>
<TABLE width="100%" bgColor=#f7f3f7>
<TBODY>
<TR>
<TD bgcolor="#CCCCCC"><FONT
color=#000000>四、外键更名</FONT></TD>
</TR>
</TBODY>
</TABLE>
<font color="#FFFFFF"><BR>
生成上面的两个脚本后,首先运行第二步中删除系统自动生成外键的脚本,将系统中命名不规范的外键删除,然后运行第三步中生成的创建外键的脚本,重新创建这些删除的外键,也就实现了对不规范外键的更名。
<BR>
<BR>
</font>
<TABLE width="975">
<TBODY>
<TR>
<TD width="588" height="15" bgcolor="#CCCCCC"><FONT
color=#000000>五、系统检查</FONT></TD>
</TR>
</TBODY>
</TABLE>
<font color="#FFFFFF"><BR>
操作完成后,重新执行步骤1,再生成一个应用系统的外键报告单,作对比检查。如果正确无误,则更名成功,否则查找原因。</font></FONT>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -