Обсуждение: Can i force deletion of dependent rows?

Поиск
Список
Период
Сортировка

Can i force deletion of dependent rows?

От
Shruthi A
Дата:
<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?

От
Tim Landscheidt
Дата:
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?

От
"Wayne E. Seguin"
Дата:
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?

От
Shoaib Mir
Дата:
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?

От
Shruthi A
Дата:
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?

От
Tim Landscheidt
Дата:
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?

От
Rob Sargent
Дата:
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
>
>