zoukankan      html  css  js  c++  java
  • 如何启用和禁用oracle&DB2数据库外键约束(转)

    转自:http://huangqiqing123.iteye.com/blog/1234817

    如何启用和禁用oracle&DB2数据库外键约束

    在工作中,有时会需要把一个数据库中的数据导入到另外一个数据库,由于外键的影响,在执行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';



     

    上图就是查询结果,其中各字段含义如下:

    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,如下:



     

    此时往数据库表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';



     

    各字段含义如下:

    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[i].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);

                   }          

           }

    本文到此结束!

  • 相关阅读:
    GTD180007:【运维】LINUX学习
    GTD180006:【运维】安装调试GDB
    {done}GTD180005:【翻译】LISP prehistory
    ComPiler180001:【学习】编译器学习链接
    AIIE180002:AIIE2015大会主题
    AIIE180001:AIIE2016大会主题
    GTD180004:【开发】python_med
    GTD180003:【开发】python_oeis
    欧亚大帝国及一战、二战
    大洲分界线
  • 原文地址:https://www.cnblogs.com/millen/p/2267231.html
Copyright © 2011-2022 走看看