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

CREATE TABLE TEST.TEST 

(  OWNER            VARCHAR2(30),

   OBJECT_ID        NUMBER,

   OBJECT_NAME      VARCHAR2(30) 

);

 

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

 

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

 

CREATE TABLE TEST.RF_TEST

(

    ID           NUMBER,

    OBJECT_ID    NUMBER

);

 

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

 

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

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

SELECT OWNER

      ,CONSTRAINT_NAME

      ,CONSTRAINT_TYPE

      ,TABLE_NAME

      ,INDEX_NAME

FROM DBA_CONSTRAINTS

WHERE TABLE_NAME='TEST';

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

SELECT DC.OWNER           AS "PARENT_TABLE_OWNER", 

       DC.TABLE_NAME      AS "PARENT_TABLE_NAME", 

       DC.CONSTRAINT_NAME AS "PRIMARY CONSTRAINT NAME", 

       DC.STATUS          AS "PRIMARY CONSTRAINT STATUS",

       DF.CONSTRAINT_NAME AS "REFERENCED CONSTRAINT NAME", 

       DF.STATUS          AS "FOREIGN CONSTRAINT STATUS",

       DF.STATUS          AS "CHILD_TABLE_OWNER", 

       DF.TABLE_NAME      AS "CHILD_TABLE_NAME" ,

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

FROM   DBA_CONSTRAINTS DC, 

       (SELECT C.OWNER, 

               C.CONSTRAINT_NAME, 

               C.R_CONSTRAINT_NAME, 

               C.TABLE_NAME,

               C.STATUS

        FROM   DBA_CONSTRAINTS C 

        WHERE  CONSTRAINT_TYPE = 'R') DF 

WHERE  DC.CONSTRAINT_NAME = DF.R_CONSTRAINT_NAME 

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

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

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

SQL> ALTER TABLE TEST.TEST DROP CONSTRAINT PK_TEST;

ALTER TABLE TEST.TEST DROP CONSTRAINT PK_TEST

                                      *

ERROR at line 1:

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

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

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

操作步骤如下:

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

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

--此脚本适用于Oracle 11g

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

     || ' ADD CONSTRAINT ' || T1_CONSTRAINT_NAME

     || ' FOREIGN KEY (' || T1_COLUMN_NAMES || ')'

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

     || '(' || T2_COLUMN_NAMES || ');' FK_SCRIPT

FROM

    (SELECT A.OWNER     T1_OWNER

          , A.TABLE_NAME T1_TABLE_NAME

          , A.CONSTRAINT_NAME T1_CONSTRAINT_NAME

          , B.R_CONSTRAINT_NAME T2_CONSTRAINT_NAME

          -- CONCATENATE COLUMNS TO HANDLE COMPOSITE

          -- FOREIGN KEYS

          , LISTAGG(A.COLUMN_NAME,', ') 

                  WITHIN GROUP (ORDER BY A.POSITION) 

                  AS T1_COLUMN_NAMES

    FROM DBA_CONS_COLUMNS A

       , DBA_CONSTRAINTS B

    WHERE A.CONSTRAINT_NAME = B.CONSTRAINT_NAME

    AND B.CONSTRAINT_TYPE = 'R'

    GROUP BY A.OWNER 

           , A.TABLE_NAME

           , A.CONSTRAINT_NAME

           , B.R_CONSTRAINT_NAME

    ) T1,

    (SELECT A.OWNER              T2_OWNER

          , A.TABLE_NAME       T2_TABLE_NAME

          , A.CONSTRAINT_NAME T2_CONSTRAINT_NAME

          -- CONCATENATE COLUMNS FOR PK/UK REFERENCED

          -- FROM A COMPOSITE FOREIGN KEY

          , LISTAGG(A.COLUMN_NAME,', ')

               WITHIN GROUP (ORDER BY A.POSITION)

               AS T2_COLUMN_NAMES

    FROM DBA_CONS_COLUMNS A

       , DBA_CONSTRAINTS B

    WHERE A.CONSTRAINT_NAME = B.CONSTRAINT_NAME

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

    GROUP BY A.OWNER

           , A.TABLE_NAME

           , A.CONSTRAINT_NAME ) T2

WHERE T1.T2_CONSTRAINT_NAME = T2.T2_CONSTRAINT_NAME

  AND T1.T1_OWNER  = T2.T2_OWNER

  AND T2.T2_OWNER ='&OWNER'

  AND T2.T2_TABLE_NAME = '&TABLE_NAME';

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

--此脚本适用于Oracle 10g

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

   || ' ADD CONSTRAINT ' || T1_CONSTRAINT_NAME

   || ' FOREIGN KEY (' || T1_COLUMN_NAMES || ')'

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

   || '(' || T2_COLUMN_NAMES || ');' FK_SCRIPT

FROM

  (SELECT A.OWNER   T1_OWNER

    , A.TABLE_NAME T1_TABLE_NAME

    , A.CONSTRAINT_NAME T1_CONSTRAINT_NAME

    , B.R_CONSTRAINT_NAME T2_CONSTRAINT_NAME

    -- CONCATENATE COLUMNS TO HANDLE COMPOSITE

    -- FOREIGN KEYS [HANDLES UP TO 5 COLUMNS]

    , MAX(DECODE(A.POSITION, 1,

         A.COLUMN_NAME,NULL)) ||

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

         A.COLUMN_NAME,NULL)) ||

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

         A.COLUMN_NAME,NULL)) ||

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

         A.COLUMN_NAME,NULL)) ||

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

         A.COLUMN_NAME,NULL))

        T1_COLUMN_NAMES

  FROM DBA_CONS_COLUMNS A

     , DBA_CONSTRAINTS B

  WHERE A.CONSTRAINT_NAME = B.CONSTRAINT_NAME

  AND B.CONSTRAINT_TYPE = 'R'

  GROUP BY A.OWNER

         , A.TABLE_NAME

         , A.CONSTRAINT_NAME

         , B.R_CONSTRAINT_NAME

  ) T1,

  (SELECT A.OWNER    T2_OWNER

    , A.CONSTRAINT_NAME T2_CONSTRAINT_NAME

    , A.TABLE_NAME T2_TABLE_NAME

    -- CONCATENATE COLUMNS FOR PK/UK REFERENCED

    -- FROM A COMPOSITE FOREIGN KEY

    , MAX(DECODE(A.POSITION, 1,

         A.COLUMN_NAME,NULL)) ||

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

         A.COLUMN_NAME,NULL)) ||

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

         A.COLUMN_NAME,NULL)) ||

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

         A.COLUMN_NAME,NULL)) ||

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

         A.COLUMN_NAME,NULL))

        T2_COLUMN_NAMES

  FROM DBA_CONS_COLUMNS A, DBA_CONSTRAINTS B

  WHERE A.CONSTRAINT_NAME = B.CONSTRAINT_NAME

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

  GROUP BY A.OWNER

         , A.TABLE_NAME

         , A.CONSTRAINT_NAME ) T2

WHERE T1.T1_OWNER = T2.T2_OWNER

  AND T1.T2_CONSTRAINT_NAME = T2.T2_CONSTRAINT_NAME

  AND T2.T2_OWNER ='&OWNER'

  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:生成删除外键约束的脚本

SELECT 'ALTER TABLE ' 

       || OWNER || '.' || TABLE_NAME

       || ' DROP CONSTRAINT '

       || CONSTRAINT_NAME

       ||';' CONSTRAINT_DISABLE

FROM  DBA_CONSTRAINTS

WHERE CONSTRAINT_TYPE = 'R'

AND STATUS = 'ENABLED'

AND R_CONSTRAINT_NAME IN

 (

   SELECT CONSTRAINT_NAME 

   FROM DBA_CONSTRAINTS

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

    AND OWNER='&OWNER'

    AND TABLE_NAME = '&TABLE_NAME'

 ); 

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

SQL> ALTER TABLE TEST.RF_TEST DROP CONSTRAINT FK_RF_TEST;

 

Table altered.

3:删除表TEST.TEST的主键

SQL> ALTER TABLE TEST.TEST DROP CONSTRAINT PK_TEST;

 

Table altered.

 

SQL> SELECT OWNER 

  2        ,TABLE_NAME

  3        ,INDEX_NAME

  4  FROM DBA_INDEXES 

  5  WHERE  TABLE_NAME='TEST';

 

OWNER      TABLE_NAME                     INDEX_NAME

---------- ------------------------------ ------------------------------

TEST        TEST                           IX_TEST_N1

 

SQL> 

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

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

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

 

 

 

Table altered.

 

 

 

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

 

 

 

Table altered.

 

 

 

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. C#设计模式(5)——建造者模式

    一.概念 建造者模式将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示. 二.模型 三.代码实现 /// <summary> /// 建造者模式的演变 /// 省略了指挥 ...

  2. js中push(),pop(),unshift(),shift()的用法

    js中push(),pop(),unshift(),shift()的用法小结   1.push().pop()和unshift().shift() 这两组同为对数组的操作,并且会改变数组的本身的长度及 ...

  3. jmeter压力测试报告

    XXX压力测试报告 时间:2015-08-04                                             测试人员:xxx 目录 XXX压力测试报告... 1 一  测试 ...

  4. 模拟一则ORA-600 [4194][][]故障并处理

    环境:OEL 5.7 + Oracle 11.2.0.3 1.模拟ORA-600 [4194][][]故障 2.使用bbed处理 3.尝试启动数据库 1.模拟ORA-600 [4194][][]故障 ...

  5. display:block inline-block inlined的区别

    一.首先要了解什么是块级元素与行级元素 块级元素 会占领页面的一行,其后多个block元素自动换行. 可以设置width,height,设置了width后同样也占领一行.同样也可以设置   margi ...

  6. tf.pad()

      说一下我理解的tf.pad(),先来看一下定义: def pad(tensor, paddings, mode="CONSTANT", name=None, constant_ ...

  7. 2014-10-28 NOIP模拟赛

    Porble 1时间与空间之旅(tstrip.*) 题目描述 公元22××年,宇宙中最普遍的交通工具是spaceship.spaceship的出现使得星系之间的联系变得更为紧密,所以spaceship ...

  8. 剑指Offer的学习笔记(C#篇)-- 数组中只出现一次的数字

    题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 题目给定:num1,num2分别为长度为1的数组.传出参数:将  num1[0], num2[0 ...

  9. 关于Struts漏洞工具的使用

    最新struts-scan资源: https://www.cesafe.com/3486.html 一,将资源下载后,放入liunx系统中,并且需要具备python2的操作环境 二,打开终端使用如下命 ...

  10. 跟踪记录ABAP对外部系统的RFC通信

    对SAP系统而言,RFC最常见的系统间通信方式,SAP与SAP系统及SAP与非SAP系统之间的连接都可以使用它.它的使用便利,功能强大,在各种接口技术中,往往是最受(ABAP开发者)青睐的选择. 查询 ...