Thread: Can i force deletion of dependent rows?
<br /><div class="gmail_quote">Hello,<br /><br />I have 2 tables (A and B) where the table B has a foreign key referenceto table A. Like this:<br /><br />create table A (x int primary key);<br />create table B (y int primary key,z int references A (x) );<br /><br /> As you can see, i've not specified any further 'on delete' clause to the foreignkey constraint like 'on delete cascade' or 'on delete restrict' or 'on delete set null' or 'on delete set default'. This means that the default behavior is followed ie 'on delete restrict' holds by default.<br /><br />Now I wantto delete a particular row from table A. Is there any way I can force deletion of all the dependent rows in table B? <br /><br />Note that the tables have already been created in the above manner and populated. I want to do this deletionthrough DML only ie without any change in the table definition.<br /><br />Thanks,<br /><font color="#888888">Shruthi<br/><br /></font></div>
Shruthi A <shruthi.iisc@gmail.com> wrote: > I have 2 tables (A and B) where the table B has a foreign key reference to > table A. Like this: > create table A (x int primary key); > create table B (y int primary key, z int references A (x) ); > As you can see, i've not specified any further 'on delete' clause to the > foreign key constraint like 'on delete cascade' or 'on delete restrict' or > 'on delete set null' or 'on delete set default'. This means that the > default behavior is followed ie 'on delete restrict' holds by default. > Now I want to delete a particular row from table A. Is there any way I can > force deletion of all the dependent rows in table B? > Note that the tables have already been created in the above manner and > populated. I want to do this deletion through DML only ie without any > change in the table definition. "DELETE FROM B WHERE z = 'your x';"? Tim
Is there another answer, asside from in the application and/or as a trigger using `DELETE FROM B WHERE z = 'x';` as it's body? ~Wayne
On Sat, Feb 13, 2010 at 10:23 PM, Wayne E. Seguin <wayneeseguin@gmail.com> wrote:
--
Shoaib Mir
http://shoaibmir.wordpress.com/
Is there another answer, asside from in the application and/or as a
trigger using `DELETE FROM B WHERE z = 'x';` as it's body?
Did you look at ON DELETE CASCADE option, check out http://www.postgresql.org/docs/8.3/interactive/ddl-constraints.html
CREATE TABLE order_items ( product_no integer REFERENCES products ON DELETE RESTRICT, order_id integer REFERENCES orders ON DELETE CASCADE, quantity integer, PRIMARY KEY (product_no, order_id)
);
--
Shoaib Mir
http://shoaibmir.wordpress.com/
Thanks people, but the trigger doesnt really solve my problem. You see, there is actually a CHAIN of dependencies whereB references A, C references B, D and E reference C and so on... So if i start writing triggers for all these, there'llbe a huge process to follow. I'm not strictly against it, i might use it as a last resort, but i'm asking if a simpleDML statement would solve my problem.<br /><br />Dear Shoaib, I did mention in a note that I don't want to recreatethe 2 tables with the 'on delete cascade' clause. The tables are ALREADY created and populated. And they are huge. So i cannot afford to drop and recreate them. I want an option in DML only. If that is possible that is.<br /><br/><br />Thanks,<br />Shruthi<br />
Shruthi A <shruthi.iisc@gmail.com> wrote: > Thanks people, but the trigger doesnt really solve my problem. You see, > there is actually a CHAIN of dependencies where B references A, C references > B, D and E reference C and so on... So if i start writing triggers for all > these, there'll be a huge process to follow. I'm not strictly against it, i > might use it as a last resort, but i'm asking if a simple DML statement > would solve my problem. > Dear Shoaib, I did mention in a note that I don't want to recreate the 2 > tables with the 'on delete cascade' clause. The tables are ALREADY created > and populated. And they are huge. So i cannot afford to drop and recreate > them. I want an option in DML only. If that is possible that is. You don't have to drop and recreate them, you could just temporarily change the foreign key definition (untested): | BEGIN WORK; | ALTER TABLE B DROP CONSTRAINT B_z_FKey; | ALTER TABLE B ADD CONSTRAINT B_z_FKey FOREIGN KEY(z) REFERENCES A(x) ON DELETE CASCADE; | DELETE FROM A WHERE x = 'your x'; | ALTER TABLE B DROP CONSTRAINT B_z_FKey; | ALTER TABLE B ADD CONSTRAINT B_z_FKey FOREIGN KEY(z) REFERENCES A(x) ON DELETE NO ACTION; | COMMIT WORK; But obviously this is no better than a simple "DELETE FROM B WHERE z = 'your x';" as you still have to name the dependen- cy chain yourself. You can query the information_schema to build this chain (e. g. cf. <URI:http://sqlserver2000.databases.aspfaq.com/schema-how-do-i-find-all-the-foreign-keys-in-a-database.html>), but I would invest more time in rethinking your processes. Tim
then I think OP needs to delete A where "your x"; On 02/13/2010 12:05 AM, Tim Landscheidt wrote: > Shruthi A<shruthi.iisc@gmail.com> wrote: > >> I have 2 tables (A and B) where the table B has a foreign key reference to >> table A. Like this: > >> create table A (x int primary key); >> create table B (y int primary key, z int references A (x) ); > >> As you can see, i've not specified any further 'on delete' clause to the >> foreign key constraint like 'on delete cascade' or 'on delete restrict' or >> 'on delete set null' or 'on delete set default'. This means that the >> default behavior is followed ie 'on delete restrict' holds by default. > >> Now I want to delete a particular row from table A. Is there any way I can >> force deletion of all the dependent rows in table B? > >> Note that the tables have already been created in the above manner and >> populated. I want to do this deletion through DML only ie without any >> change in the table definition. > > "DELETE FROM B WHERE z = 'your x';"? > > Tim > >