Oracle:通过引用将ON DELETE CASCADE添加到分区中使用的外键
问题描述:
当与PARTITION BY REFERENCE一起使用时,是否可以将ON DELETE CASCADE添加到用作分区键的外键?我正在谈论一个已经退出的桌子。Oracle:通过引用将ON DELETE CASCADE添加到分区中使用的外键
我的解决方案是删除约束并重新创建它,但它不起作用,因为我无法删除由PARTITION BY REFERENCE使用的约束。
我得到 SQL错误:ORA-14650:不支持参考分区表
的Oracle 11g操作。
drop table y;
drop table x;
create table x (a number primary key) partition by hash (a);
create table y (a number not null,
constraint y_x_fk foreign key(a) references x(a))
partition by reference(y_x_fk);
alter table y drop constraint y_x_fk;
答
我相信这是在ALTER...MODIFY
到内联选项,以使现存的约束级联别无选择;我认为你确实需要丢弃和重建,或者相当于。
我也同意,它看起来像没有干净的方式来删除和重新创建分区引用约束;我相信你会面临重新确定去那里。
更糟的是,它看起来像12c中可用的DBMS_REFEFINITION
增强功能不会让您在一个很好的一步redef,因为DBMS_REDEFINITION
doesn't support参考分区。
我认为你需要做一个老派的redef。 (它仍然值得尝试一些DBMS_REDEFINITION
与手工更换,但我会准备至少一点停机时间)。
像下面的例子一样的方法可以让你在那里(停机时间)。根据您的可用性需求,其他方法可以最大限度地减少此示例中的停机时间。
进行替换表所需CASCADING FK
:
create table y_temp (a number not null,
constraint y_temp_x_fk foreign key(a) references x(a) ON DELETE CASCADE)
partition by reference(y_temp_x_fk);
然后去只读:
ALTER TABLE X READ ONLY;
ALTER TABLE Y READ ONLY;
然后同步Y
和Y_TEMP
:
INSERT INTO Y_TEMP SELECT Y.A FROM Y;
COMMIT;
然后进行交换:
ALTER TABLE Y RENAME TO Y_OLD;
ALTER TABLE Y_TEMP RENAME TO Y;
DROP TABLE Y_OLD;
ALTER TABLE Y RENAME CONSTRAINT y_temp_x_fk TO y_x_fk;
而且带的东西备份的WRITE
ALTER TABLE X READ WRITE;
然后对其进行测试:
INSERT INTO X VALUES (1);
INSERT INTO Y VALUES (1);
SELECT * FROM Y;
A
1
DELETE FROM X;
1 row deleted.
和级联:
SELECT * FROM Y;
no rows selected
东西我没有变:你想将y_x_fk约束更改为删除级联?你说你不能删除它?你确定? –
是的,我试图删除约束时得到了ORA-14650。该表通过引用进行分区,并且此FK是分区键,您不能只放弃这样的约束。 – rattaman