获取表约束的DDL语句

本文详细介绍了如何在Oracle数据库环境中,通过使用dbms_metadata包中的GET_DEPENDENT_DDL过程,将原有数据库的约束导出并应用到新的数据库中。特别关注了处理主键、唯一和检查约束,以及外键约束的方法,并解释了在使用过程中遇到的特殊约束类型(?和O),这些类型可能与高级队列相关。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

         昨天同事遇到一个有关约束的问题. 其他同事设置了2个数据库,其中一个是从另外一个exp/imp的,但不知什么原因,

现在2个数据库的用户下表的约束存在很多不同. 他就问我有什么方法将原库的约束导出来,然后重新在新的数据库中

建立. 当然最简单的方法是使用exp重新导出原来数据库的结构信息,然后导入新数据库就可以了.

问题是他的客户端是11g,而数据库是10g,而且他工作的机器没有pl/sql developer.

        首先想到使用sql查询dba_constraints来生成所需要的东西比较麻烦,能否用dbms_metadata包中提供的过程来获取,

get_ddl只是获取表的ddl定义,当然也包含了约束,但不是单独的约束,查了一下手册,dbms_metadata.GET_DEPENDENT_DDL

可以获取我们需要的信息. 实验表明方法可行,记录下来供以后参考.

处理主键,唯一和检查约束

SELECT dbms_metadata.GET_DEPENDENT_DDL('CONSTRAINT',table_name,owner)

  FROM dba_constraints a

 where a.owner='XXXX'

   and a.constraint_type not in ('R','?','O')

   group by a.owner,a.table_name;

 

处理外键约束.

SELECT dbms_metadata.GET_DEPENDENT_DDL('REF_CONSTRAINT',table_name,owner)

  FROM dba_constraints a

 where a.owner= 'XXXX'

   and a.constraint_type='R'

   group by a.owner,a.table_name;

 

当时有趣的是同事开始运行时说报错,提示对应的CONSTRAINT类型不存在,

按照我这里的试验告诉他这个错误表示对应的表上不存在此约束,

进一步检查,竟然发现约束的类型存在?和O,我也很惊奇,在我的记忆里约束类型仅有P,U,C,R

四种类型, ?和O是什么.连到一个数据库中,一看?和O对应的表,猜测与高级队列有关.

所以修改来查询语句将这种情况排除在外.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值