FOREIGN KEYS -> Löschen, wenn kein referenzierender Datensatz mehr vorhanden ist?

FOREIGN KEYS -> Löschen, wenn kein referenzierender Datensatz mehr vorhanden ist?

am 07.08.2007 11:55:12 von Oliver Treck

Hallo.

Ich bin relativ neu in der Thematik mit FOREIGN KEYS und habe mal eine Frage
für ein Fallbeispiel.

Ich habe drei Tabellen:

- user
- comments
- items

Ein User kann zu den vorhandenen Items Kommentare schreiben oder im Zuge
eines Kommentars ein neues Item anlegen.
Sprich:

user -> 1:n -> comments
items -> 1:n -> comments

Wenn nun ein User gelöscht wird sollen natürlich auch alle Kommentare des
Users gelöscht werden, was über einen Foreign Key und ON DELETE CASCADE ja
auch sehr schön funktioniert.
Die eigentliche Problematik besteht darin, dass ein Item alleine (ohne min.
einen Kommentar) nicht bestehen kann/soll.

Ich müsste also eine Möglichkeit haben, dass das aus comments referenzierte
Item auch gelöscht wird, wenn es die einzige Referenz auf das Item ist.

Zu Deutsch:
Wenn der durch den CASCADE gelöschte Kommentar der einzige Kommentar zu dem
Item ist soll das Item auch gelöscht werden.
Gibt es weitere Kommentare von anderen Usern soll das Item erhalten bleiben.

Nun könnte man die Prozedur beispielsweise über eine Skriptsprache wie PHP
durchführen lassen und vor dem löschen der Kommentare abfragen, ob ein Item
evtl. auch gelöscht werde muss, jedoch muss ich dann ja auf die
Funktionalität von Foreign Keys verzichten, da ich ja nur das Löschen eines
Users anstoßen möchte.

Habe es schon mal mit einem Foreign Key aus Items heraus zu comments
versucht, aber dann versucht er natürlich bei jedem gelöschten Kommentar
auch das Item zu löschen, was wiederum mit dem Foreign Key in der
comments-Tabelle kollidiert und ja auch nicht der Sinn der Sache ist.

Vielleicht gibt es ja auch die Möglichkeit eine Procedur oder Funktion zu
schreiben, die beim Löschen eines Kommentars prüfen kann, ob das
referenzierte Item weitere Kommentare hat und dieses dann löscht, falls das
nicht der Fall ist.

Vielleicht hat von euch jemand mit dieser Problematik schon Erfahrung
gemacht.
Ich würde mich freuen, wenn mir jemand helfen könnte.

Vielen Dank,
Oliver Treck

Re: FOREIGN KEYS -> Löschen, wenn kein referenzierender Datensatz mehr vorhanden ist?

am 07.08.2007 11:58:28 von Christian Kirsch

Am 07.08.2007 11:55 schrieb Oliver Treck:
> Hallo.
>
> Ich bin relativ neu in der Thematik mit FOREIGN KEYS und habe mal eine Frage
> für ein Fallbeispiel.
>
> Ich habe drei Tabellen:
>
> - user
> - comments
> - items
>
> Ein User kann zu den vorhandenen Items Kommentare schreiben oder im Zuge
> eines Kommentars ein neues Item anlegen.
> Sprich:
>
> user -> 1:n -> comments
> items -> 1:n -> comments
>
> Wenn nun ein User gelöscht wird sollen natürlich auch alle Kommentare des
> Users gelöscht werden, was über einen Foreign Key und ON DELETE CASCADE ja
> auch sehr schön funktioniert.
> Die eigentliche Problematik besteht darin, dass ein Item alleine (ohne min.
> einen Kommentar) nicht bestehen kann/soll.
>
> Ich müsste also eine Möglichkeit haben, dass das aus comments referenzierte
> Item auch gelöscht wird, wenn es die einzige Referenz auf das Item ist.
>
> Zu Deutsch:
> Wenn der durch den CASCADE gelöschte Kommentar der einzige Kommentar zu dem
> Item ist soll das Item auch gelöscht werden.
> Gibt es weitere Kommentare von anderen Usern soll das Item erhalten bleiben.
>

Was spricht dagegen, sowas in einem Trigger zu erledigen?

--
Christian

Re: FOREIGN KEYS -> Löschen,wenn keinreferenzierender Datensatz mehr vorhanden ist?

am 07.08.2007 12:06:46 von B.Steinbrink

On Tue, 07 Aug 2007 11:58:28 +0200, Christian Kirsch wrote:
> Am 07.08.2007 11:55 schrieb Oliver Treck:
>> Zu Deutsch:
>> Wenn der durch den CASCADE gelöschte Kommentar der einzige Kommentar zu
>> dem Item ist soll das Item auch gelöscht werden. Gibt es weitere
>> Kommentare von anderen Usern soll das Item erhalten bleiben.
>>
>>
> Was spricht dagegen, sowas in einem Trigger zu erledigen?

Dass die momentan noch nicht durch Foreign Key Aktionen ausgelöst
werden :-(

http://dev.mysql.com/doc/refman/5.0/en/routine-restrictions. html
(ganz am Ende, direkt vor den Kommentaren stehts)

Björn

Re: FOREIGN KEYS -> Löschen, wenn kein referenzierender Datensatz mehr vorhanden ist?

am 07.08.2007 12:19:43 von Christian Kirsch

Am 07.08.2007 12:06 schrieb Björn Steinbrink:
> On Tue, 07 Aug 2007 11:58:28 +0200, Christian Kirsch wrote:
>> Am 07.08.2007 11:55 schrieb Oliver Treck:
>>> Zu Deutsch:
>>> Wenn der durch den CASCADE gelöschte Kommentar der einzige Kommentar zu
>>> dem Item ist soll das Item auch gelöscht werden. Gibt es weitere
>>> Kommentare von anderen Usern soll das Item erhalten bleiben.
>>>
>>>
>> Was spricht dagegen, sowas in einem Trigger zu erledigen?
>
> Dass die momentan noch nicht durch Foreign Key Aktionen ausgelöst
> werden :-(
>
> http://dev.mysql.com/doc/refman/5.0/en/routine-restrictions. html
> (ganz am Ende, direkt vor den Kommentaren stehts)
>

Bäh. Allerdings könnte man ja den Trigger auch auf das "eigentliche"
Delete (AFTER) setzen: Nachgucken, ob das Item keinen Kommentar mehr
hat und es dann löschen. Schön ist vermutlich was anderes.


--
Christian

Re: FOREIGN KEYS -> Löschen, wenn kein referenzierender Datensatz mehr vorhanden ist?

am 07.08.2007 13:35:40 von Oliver Treck

"Christian Kirsch" schrieb im Newsbeitrag
news:46b8473f$0$20995$9b4e6d93@newsspool1.arcor-online.net.. .
> Am 07.08.2007 12:06 schrieb Björn Steinbrink:
>> On Tue, 07 Aug 2007 11:58:28 +0200, Christian Kirsch wrote:
>>> Am 07.08.2007 11:55 schrieb Oliver Treck:
>>>> Zu Deutsch:
>>>> Wenn der durch den CASCADE gelöschte Kommentar der einzige Kommentar zu
>>>> dem Item ist soll das Item auch gelöscht werden. Gibt es weitere
>>>> Kommentare von anderen Usern soll das Item erhalten bleiben.
>>>>
>>>>
>>> Was spricht dagegen, sowas in einem Trigger zu erledigen?
>>
>> Dass die momentan noch nicht durch Foreign Key Aktionen ausgelöst
>> werden :-(
>>
>> http://dev.mysql.com/doc/refman/5.0/en/routine-restrictions. html
>> (ganz am Ende, direkt vor den Kommentaren stehts)
>>
>
> Bäh. Allerdings könnte man ja den Trigger auch auf das "eigentliche"
> Delete (AFTER) setzen: Nachgucken, ob das Item keinen Kommentar mehr
> hat und es dann löschen. Schön ist vermutlich was anderes.
>

Schön ist es nicht, aber so könnte man es machen, stimmt. Einfach alle Items
löschen, die keinen comment mehr zugeordnet haben.

Wird wohl nix besseres überig bleiben.

Schon mal vielen Dank, für den Denkanstoß.

Oliver Treck