当与PARTITION BY REFERENCE一起使用时,是否可以将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;
答案 0 :(得分:0)
我认为ALTER...MODIFY
中没有选项可以使内联选项成为现存的约束级联;我认为你确实需要删除并重新创建或等效。
我也同意,看起来没有干净的方法来删除和重新创建分区引用约束;我相信你将面临重新定位的目标。
更糟糕的是,看起来12c中提供的DBMS_REFEFINITION
增强功能无法通过DBMS_REDEFINITION
doesn't support参考分区获得良好的一步式重新设置
我认为你需要做一个老派的活动。 (用手工制作的替代品尝试一些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