oracle避免约束带来的导入数据解决方案
oracle避免约束带来的导入数据解决方案
Oracle导入数据其 实很简单,但是如果数据存在约束:如主外键、主键约束、唯一约束,可能给数据导入带来很大的麻烦。比如主外键,如果批量导入数据,是难于指定导入的先后顺 序的,相信有不少入门级朋友们,会遇到跟我一样的问题。因此,为了节省大家的宝贵时间,特此分享自己的研究成果。 个人解决方案为:在导入过程中,先导入表结构,再禁用约束,其次导入数据,最终启用约束即可。其核心就是禁用和启用约束过程的创建。具体步骤如下:
1.导出(分为2步): 导出结构、导出数据 –只导出表结构 $exp devsem/devsem@pcmdb file=d:\struct.dmp log=d:\struct.log rows=n; –导出数据 $exp devsem/devsem@pcmdb file=d:\data.dmp log=d:\data.log ; 2.导入结构 –导入表结构 $imp file=d:\struct.dmp log=d:\imp.log full=y;
3.编写过程
001 CREATE OR REPLACE PROCEDURE MANAGE_USER_CONSTRAINTS(OPERATION VARCHAR2, 002 FK BOOLEAN DEFAULT TRUE, 003 PK BOOLEAN DEFAULT TRUE, 004 UK BOOLEAN DEFAULT TRUE) IS 005 ST VARCHAR2(255); 006 CURSOR R IS 007 SELECT TABLE_NAME, CONSTRAINT_NAME 008 FROM USER_CONSTRAINTS 009 WHERE CONSTRAINT_TYPE = 'R'; 010 011 CURSOR P IS 012 SELECT TABLE_NAME, CONSTRAINT_NAME 013 FROM USER_CONSTRAINTS 014 WHERE CONSTRAINT_TYPE = 'P'; 015 016 CURSOR U IS 017 SELECT TABLE_NAME, CONSTRAINT_NAME 018 FROM USER_CONSTRAINTS 019 WHERE CONSTRAINT_TYPE = 'U'; 020 021 BEGIN 022 IF UPPER(OPERATION) IN ('DROP', 'DISABLE') THEN 023 IF FK THEN 024 BEGIN 025 FOR E IN R LOOP 026 ST := 'ALTER TABLE ' || E.TABLE_NAME || ' ' || OPERATION || ' 027 CONSTRAINT ' || E.CONSTRAINT_NAME; 028 EXECUTE IMMEDIATE (ST); 029 DBMS_OUTPUT.PUT_LINE(ST); 030 END LOOP; 031 END; 032 END IF; 033 IF PK THEN 034 BEGIN 035 FOR E IN R LOOP 036 ST := 'ALTER TABLE ' || E.TABLE_NAME || ' ' || OPERATION || ' 037 CONSTRAINT ' || E.CONSTRAINT_NAME; 038 EXECUTE IMMEDIATE (ST); 039 DBMS_OUTPUT.PUT_LINE(ST); 040 END LOOP; 041 END; 042 BEGIN 043 FOR E IN P LOOP 044 ST := 'ALTER TABLE ' || E.TABLE_NAME || ' ' || OPERATION || ' 045 CONSTRAINT ' || E.CONSTRAINT_NAME; 046 EXECUTE IMMEDIATE (ST); 047 DBMS_OUTPUT.PUT_LINE(ST); 048 END LOOP; 049 END; 050 END IF; 051 IF UK THEN 052 BEGIN 053 FOR E IN U LOOP 054 ST := 'ALTER TABLE ' || E.TABLE_NAME || ' ' || OPERATION || ' 055 CONSTRAINT ' || E.CONSTRAINT_NAME; 056 EXECUTE IMMEDIATE (ST); 057 DBMS_OUTPUT.PUT_LINE(ST); 058 END LOOP; 059 END; 060 END IF; 061 ELSIF UPPER(OPERATION) IN ('ENABLE') THEN 062 IF PK THEN 063 BEGIN 064 FOR E IN P LOOP 065 ST := 'ALTER TABLE ' || E.TABLE_NAME || ' ' || OPERATION || ' 066 CONSTRAINT ' || E.CONSTRAINT_NAME; 067 EXECUTE IMMEDIATE (ST); 068 DBMS_OUTPUT.PUT_LINE(ST); 069 END LOOP; 070 END; 071 END IF; 072 IF FK THEN 073 BEGIN 074 FOR E IN P LOOP 075 ST := 'ALTER TABLE ' || E.TABLE_NAME || ' ' || OPERATION || ' 076 CONSTRAINT ' || E.CONSTRAINT_NAME; 077 EXECUTE IMMEDIATE (ST); 078 DBMS_OUTPUT.PUT_LINE(ST); 079 END LOOP; 080 END; 081 BEGIN 082 FOR E IN R LOOP 083 ST := 'ALTER TABLE ' || E.TABLE_NAME || ' ' || OPERATION || ' 084 CONSTRAINT ' || E.CONSTRAINT_NAME; 085 EXECUTE IMMEDIATE (ST); 086 DBMS_OUTPUT.PUT_LINE(ST); 087 END LOOP; 088 END; 089 END IF; 090 IF UK THEN 091 BEGIN 092 FOR E IN U LOOP 093 ST := 'ALTER TABLE ' || E.TABLE_NAME || ' ' || OPERATION || ' 094 CONSTRAINT ' || E.CONSTRAINT_NAME; 095 EXECUTE IMMEDIATE (ST); 096 DBMS_OUTPUT.PUT_LINE(ST); 097 END LOOP; 098 END; 099 END IF; 100 ELSE 101 DBMS_OUTPUT.PUT_LINE('THE FIRST PARAMETER OF THE PROCEDURE MUST BE 102 DROP OR ENABLE OR DISABLE'); 103 END IF; 104 END; 105 /
–调用过程:禁用约束检查 exec MANAGEUSERCONSTRAINTS(‘disable’,true,true,true);
4.导入数据 $imp file=d:\data.dmp log=d:\data.log ignore=y full=y; 5.启用约束 exec MANAGEUSERCONSTRAINTS(‘enable’,true,true,true); 6.删除过程 drop procedure MANAGEUSERCONSTRAINTS;
如上查找即正确无误的导入数据,而不用担心导入的先后顺序问题了。