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

Popular posts from this blog

objective c - Change font of selected text in UITextView -

php - Accessing POST data in Facebook cavas app -

c# - Getting control value when switching a view as part of a multiview -