分区期间的约束错误 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的主要内容,如果未能解决你的问题,请参考以下文章

如何检索 SQL 表中所有列的所有约束名称

SQL 删除索引错误

Grub 错误没有这样的设备:*

解决在Mysql上删除外键时报错Error Code: 1091. Can‘t DROP ‘XXX‘; check that column/key exists

如何删除 mysql workbench 8.0 中的检查约束?

pandas .drop() 内存错误大文件