分区期间的约束错误 Drop
Posted
技术标签:
【中文标题】分区期间的约束错误 Drop【英文标题】:Constraints error during partitions Drop 【发布时间】:2017-05-19 13:14:24 【问题描述】:当我尝试在 oracle 中删除分区时,我遇到了下面提到的错误。
错误报告: SQL 错误:ORA-02266 - “表中的唯一/主键被启用的外键引用” *原因:试图截断具有唯一或 另一个表中启用的外键引用的主键。 其他不允许的操作是删除/截断一个分区 分区表或 ALTER TABLE EXCHANGE PARTITION。 *操作:在对表执行上述操作之前,禁用 其他表中的外键约束。你可以看到什么 约束通过发出以下命令来引用表 命令: SELECT * FROM USER_CONSTRAINTS WHERE TABLE_NAME = "tabnam";
我的系统约束很少,我开发的也很少,所以我需要禁用系统约束来删除分区,附上约束的截图。enter image description here
【问题讨论】:
Oracle 明确表示,问题在于在另一个表中启用了外键引用的唯一键或主键,而不是NOT NULL
约束。另外,请not screenshots
我需要禁用主键约束吗?如果另一个表有引用该表的外键约束,我是否也需要禁用它。
【参考方案1】:
我相信一个例子会澄清。假设我有一个已分区的 master
表和一个 detail
表,该表使用 FK 引用 master
:
SQL> create table master(col1 number, part number)
2 partition by list(part) (
3 partition p0 values (0),
4 partition p1 values (1),
5 partition p2 values (2)
6 );
Table created.
SQL> alter table master add constraint master_pk primary key ( col1, part);
Table altered.
SQL> create table detail(col1 number, part number, col2 varchar2(100));
Table created.
SQL> alter table detail add constraint master_detail_fk foreign key ( col1, part) references master ( col1, part);
Table altered.
根据 FK 约束,我在两个表中都插入了一些行:
SQL> insert into master (col1, part) select level, mod(level, 3) from dual connect by level < 10;
9 rows created.
SQL> insert into detail (col1, part, col2) select level, mod(level, 3), 'something' from dual connect by level < 10;
9 rows created.
现在我尝试在 master 中删除一个分区:
SQL> alter table master drop partition p1;
alter table master drop partition p1
*
ERROR at line 1:
ORA-02266: unique/primary keys in table referenced by enabled foreign keys
我需要在丢弃之前处理 FK:
SQL> alter table detail disable constraint master_detail_fk ;
Table altered.
SQL> alter table master drop partition p1;
Table altered.
当然,如果我删除了引用的行,约束将不会被验证:
SQL> alter table detail enable validate constraint master_detail_fk ;
alter table detail enable validate constraint master_detail_fk
*
ERROR at line 1:
ORA-02298: cannot validate (SIUCREDITO.MASTER_DETAIL_FK) - parent keys not
found
SQL> alter table detail enable novalidate constraint master_detail_fk ;
Table altered.
SQL>
【讨论】:
以上是关于分区期间的约束错误 Drop的主要内容,如果未能解决你的问题,请参考以下文章
解决在Mysql上删除外键时报错Error Code: 1091. Can‘t DROP ‘XXX‘; check that column/key exists