如何获取Oracle数据库表的约束条件

xlxyeyu 2009-12-28 10:01:16
我想做一个将Oracle表结构及数据导入到另外的表空间内的程序。

例如可以用select * from user_catalog获取表目录(包括Sequences)

我想知道如何才能获取到Oracle数据库表的约束条件?

最好用SQL语句实现,当然若有其他办法也欢迎跟帖。。。。

这是我当前找到的一些关于表信息的主要视图user_tab_columns、user_catalog、user_all_tables、user_col_comments、user_tab_comments等。

谢谢~~~
...全文
507 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
xlxyeyu 2009-12-28
  • 打赏
  • 举报
回复
感谢!!!
wh62592855 2009-12-28
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 xlxyeyu 的回复:]
引用 12 楼 wh62592855 的回复:
可以通过dbms_metadata.get_ddl来查看当时定义这个CHECK约束时的语句
SQL codeSQL> showuserUSERis "SYS"
SQL>select dbms_metadata.get_ddl('CONSTRAINT','SYS_C0023321','SCOTT')from dual
;

DBMS_METADATA.GET_DDL('CONSTRAINT','SYS_C0023321','SCOTT')--------------------------------------------------------------------------------ALTERTABLE "SCOTT"."T1"ADDCHECK (idin(1,2)) ENABLE


感觉很变态,查找一个约束条件还要传用户名进去。

我试了一下,返回的数据是
ALTER TABLE "HUAINANOA"."TB_TARGET" ADD CONSTRAINT "CKC_INDICATOR_FLAG_TB_TARGE" CHECK (INDICATOR_FLAG in (1,2)) ENABLE

我用PLSQL导出的是
alter table TB_TARGET
  add constraint CKC_INDICATOR_FLAG_TB_TARGE
  check (INDICATOR_FLAG in (1,2));

很好,很强大。。。


那么其余的主外键是否也可以用类似的方法获取?它的dbms_metadata.get_ddl的第一个参数又是什么?
[/Quote]
其余的主外键可以使用#6和#8的方法啊
如果你嫌不够详细 那么使用dbms_metadata.get_ddl也行
比如说来获得SCOTT的EMP表上的PK_EMP主键约束
SQL> set long 10000 --设置格式
SQL> select dbms_metadata.get_ddl('CONSTRAINT','PK_EMP','SCOTT') from dual;
DBMS_METADATA.GET_DDL('CONSTRAINT','PK_EMP','SCOTT')
--------------------------------------------------------------------------------


ALTER TABLE "SCOTT"."EMP" ADD CONSTRAINT "PK_EMP" PRIMARY KEY ("EMPNO")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUT
E STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 214
7483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "USERS" ENABLE


dbms_metadata.get_ddl的第一个参数是对象类型
第二个参数是对象名称
第三个参数是对象所有者
ACMAIN_CHM 2009-12-28
  • 打赏
  • 举报
回复
CHECK 当然取不到了,你只能分析它的内容。因为你根本不知道CHECK中会做什么。
xlxyeyu 2009-12-28
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 wh62592855 的回复:]
可以通过dbms_metadata.get_ddl来查看当时定义这个CHECK约束时的语句
SQL codeSQL> showuserUSERis "SYS"
SQL>select dbms_metadata.get_ddl('CONSTRAINT','SYS_C0023321','SCOTT')from dual
;

DBMS_METADATA.GET_DDL('CONSTRAINT','SYS_C0023321','SCOTT')--------------------------------------------------------------------------------ALTERTABLE "SCOTT"."T1"ADDCHECK (idin(1,2)) ENABLE
[/Quote]

感觉很变态,查找一个约束条件还要传用户名进去。

我试了一下,返回的数据是
ALTER TABLE "HUAINANOA"."TB_TARGET" ADD CONSTRAINT "CKC_INDICATOR_FLAG_TB_TARGE" CHECK (INDICATOR_FLAG in (1,2)) ENABLE

我用PLSQL导出的是
alter table TB_TARGET
add constraint CKC_INDICATOR_FLAG_TB_TARGE
check (INDICATOR_FLAG in (1,2));

很好,很强大。。。


那么其余的主外键是否也可以用类似的方法获取?它的dbms_metadata.get_ddl的第一个参数又是什么?
wh62592855 2009-12-28
  • 打赏
  • 举报
回复
下面是在SCOTT用户下创建表和约束时的语句
SQL> create table t1(id number check(id in(1,2)));

Table created.

SQL> insert into t1 values(3);
insert into t1 values(3)
*
ERROR at line 1:
ORA-02290: check constraint (SCOTT.SYS_C0023321) violated
wh62592855 2009-12-28
  • 打赏
  • 举报
回复
可以通过dbms_metadata.get_ddl来查看当时定义这个CHECK约束时的语句
SQL> show user
USER is "SYS"
SQL> select dbms_metadata.get_ddl('CONSTRAINT','SYS_C0023321','SCOTT') from dual
;

DBMS_METADATA.GET_DDL('CONSTRAINT','SYS_C0023321','SCOTT')
--------------------------------------------------------------------------------


ALTER TABLE "SCOTT"."T1" ADD CHECK (id in(1,2)) ENABLE
yubin88 2009-12-28
  • 打赏
  • 举报
回复
顶~~~~~~~
xlxyeyu 2009-12-28
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 wh62592855 的回复:]
呵呵 查询另外一个视图就可以得到了

就以上面的那个PK_EMP主键约束为例
SQL codeSQL>select constraint_name,table_name,column_name2from all_cons_columns3where constraint_name='PK_EMP';
CONSTRAINT_NAME TABLE_NAME COLUMN_NAME-------------------- -------------------- --------------------PK_EMP EMP EMPNO
[/Quote]

但是对于Checks就获取不到了
例如有一个:CKC_INDICATOR_FLAG_TB_TARGE INDICATOR_FLAG in (1,2)
现在就无法获取INDICATOR_FLAG in (1,2)啊
ACMAIN_CHM 2009-12-28
  • 打赏
  • 举报
回复
USER_CONSTRAINTS
USER_CONS_COLUMNS

从这两个中取就行了。
wh62592855 2009-12-28
  • 打赏
  • 举报
回复
呵呵 查询另外一个视图就可以得到了

就以上面的那个PK_EMP主键约束为例
SQL> select constraint_name,table_name,column_name
2 from all_cons_columns
3 where constraint_name='PK_EMP';
CONSTRAINT_NAME TABLE_NAME COLUMN_NAME
-------------------- -------------------- --------------------
PK_EMP EMP EMPNO
xlxyeyu 2009-12-28
  • 打赏
  • 举报
回复
嗯,约束条件的名称确实获取了,但是问题非常大。
例如主键和外键,它不能获取到它所对应的当前表的某个字段名,也就是或不知道它约束的到底是哪个字段
wh62592855 2009-12-28
  • 打赏
  • 举报
回复
--举个例子 比如说查看SCOTT用户下EMP表上的约束
SQL> select constraint_name,constraint_type,table_name,r_constraint_name
2 from dba_constraints
3 where table_name='EMP';
CONSTRAINT_NAME C TABLE_NAME R_CONSTRAINT_NAME
-------------------- - -------------------- --------------------
FK_DEPTNO R EMP PK_DEPT --外键约束 参考DEPT表上的PK_DEPT主键约束
PK_EMP P EMP --EMP表上的主键约束

--CONSTRAINT_NAME 约束名
--C 约束类型
--TABLE_NAME 约束所在的表的名称
--R_CONSTRAINT_NAME 被参考的约束名
anranran 2009-12-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 luocb1980 的回复:]
直接查一下dba视图select * from dba_constraints 不就知道了?
楼主,是不是这个意思啊?
[/Quote]

这个可能是你权限的问题
试试
select * from user_constraints
fatfoxz 2009-12-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 luocb1980 的回复:]
直接查一下dba视图select * from dba_constraints 不就知道了?
楼主,是不是这个意思啊?
[/Quote]

会报“表或者视图不存在”
luocb1980 2009-12-28
  • 打赏
  • 举报
回复
直接查一下dba视图select * from dba_constraints 不就知道了?
楼主,是不是这个意思啊?
xlxyeyu 2009-12-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 fatfoxz 的回复:]
好像不能吧。。。。。

学习。。
[/Quote]
肯定可以的,若是没法获取,远的不说,就PLSQL的好多功能都不能用了。
我在Google上找了好久,就是没找到能获取约束条件的方法
fatfoxz 2009-12-28
  • 打赏
  • 举报
回复
好像不能吧。。。。。

学习。。

17,380

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧