关于ORA-02273错误,以前还真没有仔细留意过。昨天遇到了这个问题,遂顺便总结一番,以后遇到这类问题就可以直接用下面方案解决。如下所示,我们首先准备一下测试环境。

  1. CREATE TABLE TEST.TEST

  1. (  OWNER            VARCHAR2(30),

  1.    OBJECT_ID        NUMBER,

  1.    OBJECT_NAME      VARCHAR2(30)

  1. );

  1.  

  1. CREATE INDEX TEST.IX_TEST_N1 ON TEST.TEST(OBJECT_ID)  TABLESPACE TEST_DATA;

  1.  

  1. ALTER TABLE TEST.TEST ADD CONSTRAINT PK_TEST PRIMARY KEY (OBJECT_ID) USING INDEX TABLESPACE TEST_DATA;

  1.  

  1. CREATE TABLE TEST.RF_TEST

  1. (

  1.     ID           NUMBER,

  1.     OBJECT_ID    NUMBER

  1. );

  1.  

  1. ALTER TABLE TEST.RF_TEST ADD CONSTRAINT PK_RF_TEST  PRIMARY KEY(ID) USING INDEX TABLESPACE TEST_DATA;

  1.  

  1. ALTER TABLE TEST.RF_TEST ADD CONSTRAINT FK_RF_TEST FOREIGN KEY(OBJECT_ID ) REFERENCES TEST.TEST(OBJECT_ID);

如下所示,由于脚本上面的原因(没有指定主键约束对应的索引,而且又有其他索引在主键字段上,就会产生这种情况。暂时不清楚具体原因),导致TEST.TEST的主键约束对应的索引为IX_TEST_N1。

  1. SELECT OWNER

  1.       ,CONSTRAINT_NAME

  1.       ,CONSTRAINT_TYPE

  1.       ,TABLE_NAME

  1.       ,INDEX_NAME

  1. FROM DBA_CONSTRAINTS

  1. WHERE TABLE_NAME='TEST';

此时假如我们要调整表TEST.TEST的主键,那么可以用下面脚本查看一下TEST表的主外键约束关系。如下所示:

  1. SELECT DC.OWNER           AS "PARENT_TABLE_OWNER",

  1.        DC.TABLE_NAME      AS "PARENT_TABLE_NAME",

  1.        DC.CONSTRAINT_NAME AS "PRIMARY CONSTRAINT NAME",

  1.        DC.STATUS          AS "PRIMARY CONSTRAINT STATUS",

  1.        DF.CONSTRAINT_NAME AS "REFERENCED CONSTRAINT NAME",

  1.        DF.STATUS          AS "FOREIGN CONSTRAINT STATUS",

  1.        DF.STATUS          AS "CHILD_TABLE_OWNER",

  1.        DF.TABLE_NAME      AS "CHILD_TABLE_NAME" ,

  1.        'ALTER TABLE ' || DF.OWNER  || '.' || DF.TABLE_NAME || ' DISABLE CONSTRAINT ' || DF.CONSTRAINT_NAME || ';'

  1. FROM   DBA_CONSTRAINTS DC,

  1.        (SELECT C.OWNER,

  1.                C.CONSTRAINT_NAME,

  1.                C.R_CONSTRAINT_NAME,

  1.                C.TABLE_NAME,

  1.                C.STATUS

  1.         FROM   DBA_CONSTRAINTS C

  1.         WHERE  CONSTRAINT_TYPE = 'R') DF

  1. WHERE  DC.CONSTRAINT_NAME = DF.R_CONSTRAINT_NAME

  1.        AND DC.OWNER =UPPER('&OWNER')

  1.        AND DC.TABLE_NAME=UPPER('&TABLE_NAME');

删除表的主键约束时,报如下错误:“ORA-02273: this unique/primary key is referenced by some foreign keys”

  1. SQL> ALTER TABLE TEST.TEST DROP CONSTRAINT PK_TEST;

  1. ALTER TABLE TEST.TEST DROP CONSTRAINT PK_TEST

  1.                                       *

  1. ERROR at line 1:

  1. ORA-02273: this unique/primary key is referenced by some foreign keys

我们用最上面脚本生成的禁用外键约束的脚本,禁用外键约束后,然后删除表TEST.TEST的主键约束,依然报ORA-02273错误。

如上所示,不能通过先禁用外键约束,然后删除主键约束的这样操作,搜索了相关资料后,发现只能先删除外键约束,然后才能处理主键约束。

操作步骤如下:

1: 首先生成外键约束的创建脚本,后续删除外键约束后,需要重新创建外键约束。

ORACLE 11g或以上版本使用下面脚本:

  1. --此脚本适用于Oracle 11g

  1. SELECT  'ALTER TABLE ' || T1_OWNER || '.' || T1_TABLE_NAME

  1.      || ' ADD CONSTRAINT ' || T1_CONSTRAINT_NAME

  1.      || ' FOREIGN KEY (' || T1_COLUMN_NAMES || ')'

  1.      || ' REFERENCES ' || T2_OWNER || '.' || T2_TABLE_NAME

  1.      || '(' || T2_COLUMN_NAMES || ');' FK_SCRIPT

  1. FROM

  1.     (SELECT A.OWNER     T1_OWNER

  1.           , A.TABLE_NAME T1_TABLE_NAME

  1.           , A.CONSTRAINT_NAME T1_CONSTRAINT_NAME

  1.           , B.R_CONSTRAINT_NAME T2_CONSTRAINT_NAME

  1.           -- CONCATENATE COLUMNS TO HANDLE COMPOSITE

  1.           -- FOREIGN KEYS

  1.           , LISTAGG(A.COLUMN_NAME,', ')

  1.                   WITHIN GROUP (ORDER BY A.POSITION)

  1.                   AS T1_COLUMN_NAMES

  1.     FROM DBA_CONS_COLUMNS A

  1.        , DBA_CONSTRAINTS B

  1.     WHERE A.CONSTRAINT_NAME = B.CONSTRAINT_NAME

  1.     AND B.CONSTRAINT_TYPE = 'R'

  1.     GROUP BY A.OWNER

  1.            , A.TABLE_NAME

  1.            , A.CONSTRAINT_NAME

  1.            , B.R_CONSTRAINT_NAME

  1.     ) T1,

  1.     (SELECT A.OWNER              T2_OWNER

  1.           , A.TABLE_NAME       T2_TABLE_NAME

  1.           , A.CONSTRAINT_NAME T2_CONSTRAINT_NAME

  1.           -- CONCATENATE COLUMNS FOR PK/UK REFERENCED

  1.           -- FROM A COMPOSITE FOREIGN KEY

  1.           , LISTAGG(A.COLUMN_NAME,', ')

  1.                WITHIN GROUP (ORDER BY A.POSITION)

  1.                AS T2_COLUMN_NAMES

  1.     FROM DBA_CONS_COLUMNS A

  1.        , DBA_CONSTRAINTS B

  1.     WHERE A.CONSTRAINT_NAME = B.CONSTRAINT_NAME

  1.     AND B.CONSTRAINT_TYPE IN ( 'P', 'U' )

  1.     GROUP BY A.OWNER

  1.            , A.TABLE_NAME

  1.            , A.CONSTRAINT_NAME ) T2

  1. WHERE T1.T2_CONSTRAINT_NAME = T2.T2_CONSTRAINT_NAME

  1.   AND T1.T1_OWNER  = T2.T2_OWNER

  1.   AND T2.T2_OWNER ='&OWNER'

  1.   AND T2.T2_TABLE_NAME = '&TABLE_NAME';

ORACLE 11g之前版本使用下面脚本

  1. --此脚本适用于Oracle 10g

  1. SELECT  'ALTER TABLE ' || T1_OWNER || '.' || T1_TABLE_NAME

  1.    || ' ADD CONSTRAINT ' || T1_CONSTRAINT_NAME

  1.    || ' FOREIGN KEY (' || T1_COLUMN_NAMES || ')'

  1.    || ' REFERENCES ' || T2_OWNER || '.' || T2_TABLE_NAME

  1.    || '(' || T2_COLUMN_NAMES || ');' FK_SCRIPT

  1. FROM

  1.   (SELECT A.OWNER   T1_OWNER

  1.     , A.TABLE_NAME T1_TABLE_NAME

  1.     , A.CONSTRAINT_NAME T1_CONSTRAINT_NAME

  1.     , B.R_CONSTRAINT_NAME T2_CONSTRAINT_NAME

  1.     -- CONCATENATE COLUMNS TO HANDLE COMPOSITE

  1.     -- FOREIGN KEYS [HANDLES UP TO 5 COLUMNS]

  1.     , MAX(DECODE(A.POSITION, 1,

  1.          A.COLUMN_NAME,NULL)) ||

  1.       MAX(DECODE(A.POSITION, 2,', '||

  1.          A.COLUMN_NAME,NULL)) ||

  1.       MAX(DECODE(A.POSITION, 3,', '||

  1.          A.COLUMN_NAME,NULL)) ||

  1.       MAX(DECODE(A.POSITION, 4,', '||

  1.          A.COLUMN_NAME,NULL)) ||

  1.       MAX(DECODE(A.POSITION, 5,', '||

  1.          A.COLUMN_NAME,NULL))

  1.         T1_COLUMN_NAMES

  1.   FROM DBA_CONS_COLUMNS A

  1.      , DBA_CONSTRAINTS B

  1.   WHERE A.CONSTRAINT_NAME = B.CONSTRAINT_NAME

  1.   AND B.CONSTRAINT_TYPE = 'R'

  1.   GROUP BY A.OWNER

  1.          , A.TABLE_NAME

  1.          , A.CONSTRAINT_NAME

  1.          , B.R_CONSTRAINT_NAME

  1.   ) T1,

  1.   (SELECT A.OWNER    T2_OWNER

  1.     , A.CONSTRAINT_NAME T2_CONSTRAINT_NAME

  1.     , A.TABLE_NAME T2_TABLE_NAME

  1.     -- CONCATENATE COLUMNS FOR PK/UK REFERENCED

  1.     -- FROM A COMPOSITE FOREIGN KEY

  1.     , MAX(DECODE(A.POSITION, 1,

  1.          A.COLUMN_NAME,NULL)) ||

  1.       MAX(DECODE(A.POSITION, 2,', '||

  1.          A.COLUMN_NAME,NULL)) ||

  1.       MAX(DECODE(A.POSITION, 3,', '||

  1.          A.COLUMN_NAME,NULL)) ||

  1.       MAX(DECODE(A.POSITION, 4,', '||

  1.          A.COLUMN_NAME,NULL)) ||

  1.       MAX(DECODE(A.POSITION, 5,', '||

  1.          A.COLUMN_NAME,NULL))

  1.         T2_COLUMN_NAMES

  1.   FROM DBA_CONS_COLUMNS A, DBA_CONSTRAINTS B

  1.   WHERE A.CONSTRAINT_NAME = B.CONSTRAINT_NAME

  1.   AND B.CONSTRAINT_TYPE IN ( 'P', 'U' )

  1.   GROUP BY A.OWNER

  1.          , A.TABLE_NAME

  1.          , A.CONSTRAINT_NAME ) T2

  1. WHERE T1.T1_OWNER = T2.T2_OWNER

  1.   AND T1.T2_CONSTRAINT_NAME = T2.T2_CONSTRAINT_NAME

  1.   AND T2.T2_OWNER ='&OWNER'

  1.   AND T2.T2_TABLE_NAME = '&TABLE_NAME';

使用上面脚本生成的脚本为

ALTER TABLE TEST.RF_TEST ADD CONSTRAINT FK_RF_TEST FOREIGN KEY (OBJECT_ID) REFERENCES TEST.TEST(OBJECT_ID);

2:生成删除外键约束的脚本

  1. SELECT 'ALTER TABLE ' 

  1.        || OWNER || '.' || TABLE_NAME

  1.        || ' DROP CONSTRAINT '

  1.        || CONSTRAINT_NAME

  1.        ||';' CONSTRAINT_DISABLE

  1. FROM  DBA_CONSTRAINTS

  1. WHERE CONSTRAINT_TYPE = 'R'

  1. AND STATUS = 'ENABLED'

  1. AND R_CONSTRAINT_NAME IN

  1. (

  1.    SELECT CONSTRAINT_NAME

  1.    FROM DBA_CONSTRAINTS

  1.    WHERE CONSTRAINT_TYPE IN ('P', 'U')

  1.     AND OWNER='&OWNER'

  1.     AND TABLE_NAME = '&TABLE_NAME'

  1. );

执行上面脚本生成的脚本,删除外键约束。

  1. SQL> ALTER TABLE TEST.RF_TEST DROP CONSTRAINT FK_RF_TEST;

  1.  

  1. Table altered.

3:删除表TEST.TEST的主键

  1. SQL> ALTER TABLE TEST.TEST DROP CONSTRAINT PK_TEST;

  1.  

  1. Table altered.

  1.  

  1. SQL> SELECT OWNER

  1.   2        ,TABLE_NAME

  1.   3        ,INDEX_NAME

  1.   4  FROM DBA_INDEXES

  1.   5  WHERE  TABLE_NAME='TEST';

  1.  

  1. OWNER      TABLE_NAME                     INDEX_NAME

  1. ---------- ------------------------------ ------------------------------

  1. TEST        TEST                           IX_TEST_N1

  1.  

  1. SQL>

如下所示,这种情况下,删掉了约束,并不会删除对应的索引。所以必须手工删除该索引

4: 在表TEST.TEST上增加主键约束, 在表TEST.RF_TEST上添加外键约束。

  1. SQL> ALTER TABLE TEST.TEST ADD CONSTRAINT PK_TEST PRIMARY KEY(OBJECT_ID) USING INDEX TABLESPACE TEST_DATA;

  1.  

  1.  

  1.  

  1. Table altered.

  1.  

  1.  

  1.  

  1. SQL> ALTER TABLE TEST.RF_TEST ADD CONSTRAINT FK_RF_TEST FOREIGN KEY (OBJECT_ID) REFERENCES TEST.TEST(OBJECT_ID);

  1.  

  1.  

  1.  

  1. Table altered.

  1.  

  1.  

  1.  

  1. SQL>

ORA-02273: this unique/primary key is referenced by some foreign keys的更多相关文章

  1. ORA-02266: unique/primary keys in table referenced by enabled foreign keys

    在数据库里面使用TRUNCATE命令截断一个表的数据时,遇到如下错误 SQL >TRUNCATE TABLE ESCMOWNER.SUBX_ITEM ORA-02266: unique/prim ...

  2. ORA-02429: cannot drop index used for enforcement of unique /primary key

    相信不少人遇到过ORA-02429: cannot drop index used for enforcement of unique /primary key 这个错误,对应的中文提示"O ...

  3. Each record in table should have a unique `key` prop,or set `rowKey` to an unique primary key.

    Each record in table should have a unique `key` prop,or set `rowKey` to an unique primary key. 1.rea ...

  4. oracle约束总结(not null/unique/primary key/foreign key/check)

    约束(constraint):对创建的表的列属性.字段进行的限制. 诸如:not null/unique/primary key/foreign key/check 作用范围:         ①列级 ...

  5. antd desgin vue 报错 Warning: Each record in table should have a unique `key` prop,or set `rowKey` to an unique primary key.

    警告:表的数据源中的每条记录都应该有一个唯一的“key”道具,或者将表的“rowKey”设置为一个唯一的主键, 只需要添加 :rowKey="record => record.id&q ...

  6. React表格报错Each record in table should have a unique `key` prop,or set `rowKey` to an unique primary key.

    解决: <Table bordered rowKey={record=>record.id} //解决 components={this.components} columns={colu ...

  7. mysql中key 、primary key 、unique key 与index区别

    一.key与primary key区别 CREATE TABLE wh_logrecord ( logrecord_id ) NOT NULL auto_increment, ) default NU ...

  8. 数据库六大约束用法:主键(primary key)、外键(foreign key)、非空(not null)、默认(default)、检查(check)、唯一(unique)

    1. 数据库有六大约束 主键(primary key) 外键(foreign key):被参照的键必须有唯一约束或是主键 非空(not null) 默认(default) 检查(check):orac ...

  9. MySQL中KEY、PRIMARY KEY、UNIQUE KEY、INDEX 的区别

    参考:MySQL中KEY.PRIMARY KEY.UNIQUE KEY.INDEX 的区别 对于题目中提出的问题,可以拆分来一步步解决.在 MySQL 中 KEY 和 INDEX 是同义.那这个问题就 ...

随机推荐

  1. ambari2.1.1安装

    1       安装环境 系统:centos6.6 Ambari版本:2.1.1 安装指南:https://cwiki.apache.org/confluence/display/AMBARI/Ins ...

  2. POJ-3262

    Protecting the Flowers Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7923   Accepted: ...

  3. ubuntu系统开root以及(su:认证失败)完美解决

    开机进入桌面,ctrl+alt+T打开终端————在此时终端显示的是 用户名@电脑名:-$   表示普通用户 在此处输入:sudo passwd root 此时提示———— [sudo] passwo ...

  4. Eclipse下对maven进行配置

    前提:安装好maven插件http://www.cnblogs.com/lchzls/p/6281697.html 1.需要修改配置:首先选择Window->Preferences,弹出如下对话 ...

  5. IDEA如何找到接口的实现类

    如何找到接口的实现类 (IDEA))在ApplicationContext上右击 Diagrams ->show diagram 可以看到继承关系: 在ApplicationContext上右击 ...

  6. 《深入理解Java虚拟机》笔记03 -- 垃圾收集器

    收集器可以大致分为:单线程收集器, 并发收集器和并行收集器. 并行(Parallel):指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态. 并发(Concurrent):指用户线程与垃圾收集 ...

  7. SpringBoot2.0 基础案例(13):基于Cache注解模式,管理Redis缓存

    本文源码 GitHub地址:知了一笑 https://github.com/cicadasmile/spring-boot-base 一.Cache缓存简介 从Spring3开始定义Cache和Cac ...

  8. datastream解析

    在EOS的eosiolib模块中有一个datasteam.hpp文件,它几乎实现了所有类型对字节流的转换,是一个非常强大的工具类,在这里对它的做一个简单的提取,也加强一下自己对它的理解.在下面的工程中 ...

  9. linux grep (转)

    常用用法 [root@www ~]# grep [-acinv] [--color=auto] '搜寻字符串' filename 选项与参数: -a :将 binary 文件以 text 文件的方式搜 ...

  10. jquery.jscrollpane.js滚动速度设置

    首先找到插件里面的这个函数,改变成下面的样子: function initMousewheel() { container.unbind(mwEvent).bind( mwEvent, functio ...