ORA-02273: this unique/primary key is referenced by some foreign keys
关于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的更多相关文章
- ORA-02266: unique/primary keys in table referenced by enabled foreign keys
在数据库里面使用TRUNCATE命令截断一个表的数据时,遇到如下错误 SQL >TRUNCATE TABLE ESCMOWNER.SUBX_ITEM ORA-02266: unique/prim ...
- 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 ...
- 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 ...
- oracle约束总结(not null/unique/primary key/foreign key/check)
约束(constraint):对创建的表的列属性.字段进行的限制. 诸如:not null/unique/primary key/foreign key/check 作用范围: ①列级 ...
- 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 ...
- 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 ...
- mysql中key 、primary key 、unique key 与index区别
一.key与primary key区别 CREATE TABLE wh_logrecord ( logrecord_id ) NOT NULL auto_increment, ) default NU ...
- 数据库六大约束用法:主键(primary key)、外键(foreign key)、非空(not null)、默认(default)、检查(check)、唯一(unique)
1. 数据库有六大约束 主键(primary key) 外键(foreign key):被参照的键必须有唯一约束或是主键 非空(not null) 默认(default) 检查(check):orac ...
- MySQL中KEY、PRIMARY KEY、UNIQUE KEY、INDEX 的区别
参考:MySQL中KEY.PRIMARY KEY.UNIQUE KEY.INDEX 的区别 对于题目中提出的问题,可以拆分来一步步解决.在 MySQL 中 KEY 和 INDEX 是同义.那这个问题就 ...
随机推荐
- android apk 自我保护技术-完整性校验
关于防止android apk被反编译的技术我们前面已经讲了四种. 加壳技术 运行时修改字节码 伪加密 对抗JD-GUI 如果有不明白的可以查看我的博客的前四篇中关于这四种技术的介绍.接下来我们接着介 ...
- Oracle的rowid
ROWID是数据的详细地址,通过rowid,oracle可以快速的定位某行具体的数据的位置. ROWID可以分为物理rowid和逻辑rowid两种.普通的堆表中的rowid是物理rowid,索引组织表 ...
- URL shortening service
Use Cases 1, shortening : take a URL => return a much shorter URL 2, redirection : take a short U ...
- 「一入 Java 深似海 」系列课程
第一期 「一入 Java 深似海 」系列课程 - 第一期 第一节:Java 语言基础
- jsonp的使用方法
参数jsonp 和 jsonpCallback jsonp指定使用哪个名字将回调函数传给服务端,也就是在服务端通过 request.getParameter(""); 的那个名字, ...
- Android图片压缩框架-Tiny 集成
为了简化对图片压缩的调用,提供最简洁与合理的api压缩逻辑,对于压缩为Bitmap根据屏幕分辨率动态适配最佳大小,对于压缩为File优化底层libjpeg的压缩,整个图片压缩过程全在压缩线程池中异步压 ...
- backgroundWorker取消后,重新开始就报错:此 BackgroundWorker 当前正忙,无法同时运行多个任务。
使用BackgroundWorker控件,有2个按钮buttonBegin和buttonCancel.其他都正常,只是在用buttonBegin开始运行,然后点击buttonCancel取消后,到这里 ...
- [openjudge] 1455:An Easy Problem 贪心
描述As we known, data stored in the computers is in binary form. The problem we discuss now is about t ...
- 洛谷P4099 [HEOI2013]SAO(树形dp)
传送门 HEOI的题好珂怕啊(各种意义上) 然后考虑树形dp,以大于为例 设$f[i][j]$表示$i$这个节点在子树中排名第$j$位时的总方案数(因为实际只与相对大小有关,与实际数值无关) 我们考虑 ...
- 关于HTML5画布canvas的功能
一.画布的使用 1.首先创建一个画布(canvas) <canvas id=”myCanvas” width=”200” height=”100” style=”border:1px solid ...