oracle - How to delete rows with bi-directional dependencies? -
i'm using oracle 10g express , trying delete records tables bi-directional constraints. i'm trying un-thread hundreds of tables , dependencies generated via hibernate (which can't changed @ point), here extremely simplified example:
create table tablea (id number(19,0) not null, ..., rtablea_id number(19,0), primary key (id)); create table tableb (id number(19,0) not null, ..., rtableb_id number(19,0), primary key (id)); alter table tablea add constraint fka1 foreign key (rtablea_id) references tableb; alter table tableb add constraint fkb1 foreign key (rtableb_id) references tablea;
trying delete entries either table returns following:
edit: happens in case foreign keys prefixed sys_
ora-02292: integrity constraint (xxx.fka1) violated - child record found
i've tried disable constraints attempts futile:
ora-02297: cannot disable constraint (xxx.fka1) - dependencies exist
i have wonder how data got in state in first place, since foreign keys not null
. if both tables empty start with, you'd never able insert row either table.
ignoring moment, recreating scenario, have no problem disabling constraints:
create table tablea(id number(19, 0) not null, rtablea_id number(19, 0) not null, primary key(id)) / create table tableb(id number(19, 0) not null, rtableb_id number(19, 0) not null, primary key(id)) / insert tablea values (1, 2) / insert tableb values (2, 1) / alter table tablea add constraint fka1 foreign key (rtablea_id) references tableb / alter table tableb add constraint fkb1 foreign key (rtableb_id) references tablea / alter table tablea modify constraint fka1 disable / alter table tableb modify constraint fkb1 disable / delete tablea / delete tableb / commit /
result:
table created. table created. 1 row created. 1 row created. table altered. table altered. table altered. table altered. 1 row deleted. 1 row deleted. commit complete.
i'm not sure how you'd ora-02297
error when attempting disable foreign key. error typically seen when disabling primary or unique key foreign key relies upon.
i suspect want set constraints initially deferred
. allow perform inserts , deletes each table individually, long corresponding row updated or deleted before transaction commited:
create table tablea(id number(19, 0) not null, rtablea_id number(19, 0) not null, primary key(id)) / create table tableb(id number(19, 0) not null, rtableb_id number(19, 0) not null, primary key(id)) / alter table tablea add constraint fka1 foreign key (rtablea_id) references tableb deferred / alter table tableb add constraint fkb1 foreign key (rtableb_id) references tablea deferred / insert tablea values (1, 2) / insert tableb values (2, 1) / insert tableb values (3, 1) / commit / delete tableb id = 2 / update tablea set rtablea_id = 3 id = 1 / commit /
result:
table created. table created. table altered. table altered. 1 row created. 1 row created. 1 row created. commit complete. 1 row deleted. 1 row updated. commit complete.
Comments
Post a Comment