![]() | |
![]() |
| | Thread Tools | Display Modes |
#1
| |||
| |||
|
#2
| |||
| |||
|
|
I have a situation that is somewhat the opposite of the case in which you would use ON DELETE CASCADE on a foreign key in a child table to ensure that when a row in the parent table was deleted, the delete would cascade to the matching rows in the Child table (see example below). CREATE TABLE Parent ( parentId INT NOT NULL, PRIMARY KEY(parentId) ); CREATE TABLE Child ( childId INT NOT NULL, PRIMARY KEY(childId), FOREIGN KEY (parentId) REFERENCES Parent(parentId) ); In my case, I want to delete a row in the parent table when the last row in the child table referencing that (parent) row is deleted (N:1 from child to parent). Is there any way to do this automatically? Otherwise, it seems that it would be necessary to check the Child table each time a delete is performed to see if any rows still reference the same parent row and then delete it (the parent row) if none are found. Thanks, CM |
#3
| |||
| |||
|
|
I have a situation that is somewhat the opposite of the case in which you would use ON DELETE CASCADE on a foreign key in a child table to ensure that when a row in the parent table was deleted, the delete would cascade to the matching rows in the Child table (see example below). CREATE TABLE Parent ( parentId INT NOT NULL, PRIMARY KEY(parentId) ); CREATE TABLE Child ( childId INT NOT NULL, PRIMARY KEY(childId), FOREIGN KEY (parentId) REFERENCES Parent(parentId) ); In my case, I want to delete a row in the parent table when the last row in the child table referencing that (parent) row is deleted (N:1 from child to parent). Is there any way to do this automatically? Otherwise, it seems that it would be necessary to check the Child table each time a delete is performed to see if any rows still reference the same parent row and then delete it (the parent row) if none are found. Thanks, CM |
#4
| |||
| |||
|
|
On Sep 29, 12:36 pm, cm <cmonthe... (AT) yahoo (DOT) com> wrote: .... In my case, I want to delete a row in the parent table when the last row in the child table referencing that (parent) row is deleted (N:1 from child to parent). Is there any way to do this automatically? Otherwise, it seems that it would be necessary to check the Child table each time a delete is performed to see if any rows still reference the same parent row and then delete it (the parent row) if none are found. Thanks, CM What is the meaning of the presence of a row in Parent at first insertion (i.e., before any "children" are entered) that is not the same meaning later on after all of its children are deleted? |
#5
| |||
| |||
|
|
Yeah, off-hand all that comes to mind is a trigger that fires on DELETEs and does an EXISTS test. Since your PK and, almost certainly, FK columns are indexed, the performance may be acceptable. Which RDBMS are you running? --Jeff |
#6
| |||
| |||
|
|
I have a situation that is somewhat the opposite of the case in which you would use ON DELETE CASCADE on a foreign key in a child table to ensure that when a row in the parent table was deleted, the delete would cascade to the matching rows in the Child table (see example below). CREATE TABLE Parent ( parentId INT NOT NULL, PRIMARY KEY(parentId) ); CREATE TABLE Child ( childId INT NOT NULL, PRIMARY KEY(childId), FOREIGN KEY (parentId) REFERENCES Parent(parentId) ); In my case, I want to delete a row in the parent table when the last row in the child table referencing that (parent) row is deleted (N:1 from child to parent). Is there any way to do this automatically? Otherwise, it seems that it would be necessary to check the Child table each time a delete is performed to see if any rows still reference the same parent row and then delete it (the parent row) if none are found. Thanks, CM |
#7
| |||
| |||
|
|
On Sep 29, 12:36 pm, cm <cmonthe... (AT) yahoo (DOT) com> wrote: I'm curious - is there any theory-based reason that most (all?) commercial DBMSs require a uniqueness on the parent of a foreign key constraint? I wouldn't imagine - I've always put it on the "DBMS- implementer-convenience / end-user nuisance" list of SQL features. |
#8
| |||
| |||
|
|
Yeah, off-hand all that comes to mind is a trigger that fires on DELETEs and does an EXISTS test. Since your PK and, almost certainly, FK columns are indexed, the performance may be acceptable. Which RDBMS are you running? --Jeff I am running MySQL. Yes, the trigger approach was suggested to me separately, and probably could be made to work. I am wondering about concurrency issues though. Suppose the EXISTS test indicates that no FKs reference the applicable parent row when the check is made, but, before the delete of the parent row can be made, another insert finds the parent row already exists and references it. Thanks, Carl |
#9
| |||
| |||
|
|
On Sep 29, 12:36*pm, cm <cmonthe... (AT) yahoo (DOT) com> wrote: I have a situation that is somewhat the opposite of the case in which you would use ON DELETE CASCADE on a foreign key in a child table to ensure that when a row in the parent table was deleted, the delete would cascade to the matching rows in the Child table (see example below). CREATE TABLE Parent ( parentId INT NOT NULL, PRIMARY KEY(parentId) ); CREATE TABLE Child ( childId INT NOT NULL, PRIMARY KEY(childId), FOREIGN KEY (parentId) REFERENCES Parent(parentId) ); In my case, I want to delete a row in the parent table when the last row in the child table referencing that (parent) row is deleted (N:1 from child to parent). Is there any way to do this automatically? Otherwise, it seems that it would be necessary to check the Child table each time a delete is performed to see if any rows still reference the same parent row and then delete it (the parent row) if none are found. Thanks, CM Well, if there were a logically identifiable child which should always be the first added and last removed, you could have a foreign key from the parent to the primary key of *that* child. *For instance, an invoice that has many lines, that will always have line 1, might use this approach (works in Oracle, not sure how it'd fare in other products) create table invoices (invoice_num number primary key, first_line number DEFAULT 1 check (first_line = 1) *not null) / create table lines (invoice_num number, constraint lines_fk1 * * foreign key (invoice_num) * * references invoices(invoice_num) *on delete cascade * * initially deferred deferrable , line_no number not null, constraint lines_pk primary key (invoice_num, line_no)) / alter table invoices add (constraint invoices_fk1 foreign key (invoice_num, first_line) references lines(invoice_num, line_no) *on delete cascade initially deferred deferrable ) / Of course, if you delete line1 prematurely, you'll start a cascade that wipes out the invoice itself, and all other lines on that invoice. I'm curious - is there any theory-based reason that most (all?) commercial DBMSs require a uniqueness on the parent of a foreign key constraint? *I wouldn't imagine - I've always put it on the "DBMS- implementer-convenience / end-user nuisance" list of SQL features.- Hide quoted text - |
| - Show quoted text - |
![]() |
| Thread Tools | |
| Display Modes | |
| |