前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关于primary key和foreign key的问题处理(60天)

关于primary key和foreign key的问题处理(60天)

作者头像
jeanron100
发布2018-03-14 10:01:27
9530
发布2018-03-14 10:01:27
举报

今天碰到一个问题,在drop primary key的时候,提示ORA-02273的错误。

代码语言:javascript
复制
SQL> ALTER TABLE AR1_ACCOUNT DROP PRIMARY KEY;
ALTER TABLE AR1_ACCOUNT DROP PRIMARY KEY
*
ERROR at line 1:
ORA-02273: this unique/primary key is referenced by some foreign keys

通过下面的字典表查找的关联的表

代码语言:javascript
复制
SQL> SELECT con.constraint_name const_name, con.constraint_type const_type,
  2         con.table_name, con.search_condition search_cond,
  3         con.r_constraint_name r_const, col.table_name r_table,
       col.column_name r_column
  FROM user_constraints con, user_cons_columns col
 WHERE col.constraint_name = con.r_constraint_name  4    5    6  
  7  AND col.table_name='AR1_ACCOUNT';
CONST_NAME                     C TABLE_NAME                     SEARCH_COND          R_CONST                        R_TABLE                        R_COLUMN
------------------------------ - ------------------------------ -------------------- ------------------------------ ------------------------------ --------------------
AR3_GL_UNBILLED_REV_1FK        R AR3_GL_UNBILLED_REV                                 AR1_ACCOUNT_PK                 AR1_ACCOUNT                    ACCOUNT_ID

到此为止,我想为了保险起见,先把表AR3_GL_UNBILLED_REV的foreign key disable以后,再来drop这个表AR1_ACCOUNT 的primary key

使用alter table xxxx disable constraint xxxx;

执行成功了,但是drop primary key的时候还是提示错误 ORA-02273

没办法,看来disable不行,那只能drop了,为了保险起见,先来spool一下创建constraint 的ddl 语句,但是调用时,又出现了问题。

代码语言:javascript
复制
SQL> SELECT DBMS_METADATA.GET_DDL('CONSTRAINT','AR3_GL_UNBILLED_REV_1FK')FROM DUAL;
ERROR:
ORA-31603: object "AR3_GL_UNBILLED_REV_1FK" of type CONSTRAINT not found in
schema "TEST"
ORA-06512: at "SYS.DBMS_SYS_ERROR", line 105
ORA-06512: at "SYS.DBMS_METADATA", line 3149
ORA-06512: at "SYS.DBMS_METADATA", line 4787
ORA-06512: at line 1

查询网上所说,有的人说可能是权限问题,赋予select_catalog_owner权限就好了。但是很奇怪的,怎么试都不行。

最后查了下大家的反馈,确定这是一个bug.这也是dbms_metadata的一个一个限制,在11g版本这个问题依然存在。

最后做了一个表的ddl,这样就包含了foreign key的信息

然后drop了foreign key的constraint之后,drop primary key的操作就可以了继续了。

在脚本最后,需要记得重建那个foreign key.

代码语言:javascript
复制
SQL> ALTER TABLE AR3_GL_UNBILLED_REV ADD CONSTRAINT AR3_GL_UNBILLED_REV_1FK FOREIGN KEY (ACCOUNT_ID) REFERENCES AR1_ACCOUNT(ACCOUNT_ID);
Table altered.
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2014-05-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 杨建荣的学习笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档