Thread: Can i force deletion of dependent rows?

Can i force deletion of dependent rows?

From
Shruthi A
Date:
<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> 

Re: Can i force deletion of dependent rows?

From
Tim Landscheidt
Date:
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



Re: Can i force deletion of dependent rows?

From
"Wayne E. Seguin"
Date:
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


Re: Can i force deletion of dependent rows?

From
Shoaib Mir
Date:
On Sat, Feb 13, 2010 at 10:23 PM, Wayne E. Seguin <wayneeseguin@gmail.com> wrote:
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/

Re: Can i force deletion of dependent rows?

From
Shruthi A
Date:
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 /> 

Re: Can i force deletion of dependent rows?

From
Tim Landscheidt
Date:
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



Re: Can i force deletion of dependent rows?

From
Rob Sargent
Date:
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
>
>