设为首页 收藏本站
查看: 856|回复: 0

[经验分享] 如何启用和禁用oracle&DB2数据库外键约束

[复制链接]
YunVN网友  发表于 2016-8-15 06:46:20 |阅读模式
在工作中,有时会需要把一个数据库中的数据导入到另外一个数据库,由于外键的影响,在执行insert语句时,需要确保先插入父表中的数据,然后插入子表中的数据,由于一个项目中,数据库表关系错综复杂,缕清主外键关系并排列好顺序实非易事,此时暂时禁用外键约束变得非常的必要,另外,笔者在日常的API测试时,需要向数据库中插入部分基础数据,经常碰到此问题,特总结了OracleDB2数据库下如何禁用外键约束的方法。
一、Oracle数据库:
禁用约束基本语法:
alter table 数据库表名 disable  constraint  约束名
 
假设现在需要关闭pub_organ的外键约束:
1、  首先查询pub_organ存在哪些外键约束,此时需要用到oracle的字典表user_constraints
select * from user_constraints where table_name='PUB_ORGAN';

DSC0000.png
 
上图就是查询结果,其中各字段含义如下:
OWNER: 表的所有者
CONSTRAINT_NAME: 约束名称
CONSTRAINT_TYPE: 约束类型(R代表外键,P代表主键,C代表check约束)
TABLE_NAME: 表名称
SEARCH_CONDITION:  check约束的具体信息
STATUS:  ENABLED表示当前约束是启用的,DISABLED表示当前约束未启用。
2、  查询出表存在哪些约束后,即可以通过alter语句启用或禁用指定的约束了。
如禁用pub_organ表的外键PUBORGAN_FK1,则可以使用如下命令实现:
alter table PUB_ORGAN disable  constraint   PUBORGAN_FK1;
执行后,再次查询字典表user_constraints,如下:

DSC0001.png
 
此时往数据库表pub_organ中插入数据时就不再受外键约束的影响了。
 
启用约束基本语法:
alter table 数据库表名 enable  constraint  约束名
 
如现在需要重新启用pub_organ的外键约束,可以使用如下命令:
alter table PUB_ORGAN  enable  constraint   PUBORGAN_FK1;
二、DB2数据库:
禁用约束基本语法:
ALTER TABLE 表名称 ALTER FOREIGN KEY 约束名称 NOT ENFORCED

 
启用约束基本语法:
ALTER TABLE 表名称 ALTER FOREIGN KEY 约束名称  ENFORCED

 
相关字典表:SYSIBM.SYSTABCONST
如:select * from SYSIBM.SYSTABCONST where tbname='PUB_ORGAN';

DSC0002.png
 
各字段含义如下:
NAME: 约束名称
DEFINER: 定义者
CONSTRAINTTYP: 约束类型(P代表主键,F代表外键)
TBNAME: 表名称
ENFORCED: 是否启用(Y代表启用,N代表未启用)
三、封装成java接口、批量执行
在实际工作中,经常会将若干个表,或者所有数据库表的外键一起禁用,此时需要批量执行相关命令,笔者根据工作实际,使用java封装了相关接口,以方便使用。
对外暴露接口如下:
/*

     * 启用当前用户指定tableName的所有外键约束

     * 入参使用可变参数(jdk5新特性)

     * 调用方式:

     * 1、enableFK("pub_organ")

     * 2、enableFK("pub_organ","pub_stru")

     * 3、enableFK(new String[]{"pub_organ","pub_stru"})

     */

    public static void enableFK(String...tableNames){

       disableORenbaleFK(true,tableNames);

    }

/*

     * 禁用当前用户指定tableName的所有外键约束

     */

    public static void disableFK(String...tableNames){

       disableORenbaleFK(false,tableNames);

    }
/*

     * 启用当前用户所有表的外键约束

     */

    public static void enableAllFK(){

       disableORenableAllConstraint(true);

    }

    /*

     * 禁用当前用户所有表的外键约束

     */

    public static void disableAllFK(){

       disableORenableAllConstraint(false);

    }
 
其中核心处理代码如下:
 

       if(tableNames==null||tableNames.length==0){

           throw new RuntimeException("入参tableNames不能为空!");

       }

       //查询指定表的外键约束

       String sql = null;

       String dbType = getDBType();

       if(dbType.contains("ORACLE")){

           sql = "select 'alter table ' || table_name || ' disable constraint ' || constraint_name  from user_constraints where constraint_type='R' and TABLE_NAME in(";

           if(isEnable){

              sql = sql.replace("disable", "enable");

           }     

       }else if(dbType.contains("DB2")){

           sql = "select 'ALTER TABLE '  || TBNAME ||  ' ALTER FOREIGN KEY ' || NAME ||' NOT ENFORCED ' FROM SYSIBM.SYSTABCONST WHERE CONSTRAINTYP='F' and TBNAME in(";

           if(isEnable){

              sql = sql.replace("NOT ENFORCED", "ENFORCED");

           }     

       }else{

           throw new RuntimeException("数据库类型无效(仅支持Oracle和DB2),dbType="+dbType);

       }  

       StringBuffer generateSQL = new StringBuffer(sql);

       for(int i=0;i<tableNames.length;i++){ 

           generateSQL.append(" '");

           generateSQL.append(tableNames.toUpperCase());//注意须转换成大写

           generateSQL.append("',");

       }

       generateSQL.deleteCharAt(generateSQL.length()-1);

       generateSQL.append(")");

       List<Map<String, Object>> dataSet = DBTool.executeQuery(generateSQL.toString());

      

       //启用or停止查询出的外键约束

       for(int i=0;i<dataSet.size();i++){

           Map<String, Object> record = dataSet.get(i);

            Iterator<Entry<String, Object>> itor = record.entrySet().iterator();  

               while(itor.hasNext())  

               {  

                  Entry<String, Object> e = itor.next();

                  DBTool.executeUpdate(e.getValue().toString(),UpdateType.ALTER);

               }          

       }

 
本文到此结束!

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-257789-1-1.html 上篇帖子: Oracle 大规模 delete,update 操作 注意事项 下篇帖子: oracle+sql server+mysql 数据库tomcat配置连接信息
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表