phpmyadmin.. restrict e no action??!!...

ciao,

ho una tabella padre (p1,p2) e una figlio(f1,f2).

figlio.f2->padre.p2

Sto usando phpmyadmin.

Suppondendo:  p1  p2

                          1    1

                          2    2

                          f1   f2

                          3    1

                          4    1

Se faccio  "delete cascade" di  p1,p2 (1,1).. vengono cancellati giustamente sia f1,f2 (3,1) sia (4,1).

Con "delete set null" funziona altrettanto bene ( e il comportamento è quello da me aspettato e ottengo la cancellazione di p1,p2(1,1) e f1,f2(3,NULL) e (4,NULL)).

Ma se faccio "delete no action" (oppure "delete restrict")  e cerco di cancellare p1,p2 (1,1) dal padre.. io mi aspetteresi e vorrei che f1,f2 (3,1) e (4,1) rimangano presenti nella tabella figlio.. ma phpmyadmin mi dà errore (a causa del vincolo  referenziale   figlio.f2->padre.p2) e non mi permette di cancellare (1,1) dal padre.

Cosa devo fare per riuscire a cancellare (1,1) dal padre e non cancellare le tuple corrispondenti nella tabella figlio?

 ???

Grazie.

inviato 10 anni fa
gilles27
X 0 X

Non è possibile cancellare una riga della tabella padre senza modificare le relative righe della tabella figli.

no action e restrict dicono a MySQL di non procedere con la cancellazione in caso di presenza di figli legati al padre da cancellare.

L'unico modo per conservare i figli è con "set null"

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

già .. è vero.. cmq brutta notizia.. :-\.. thanks cmq..

risposto 10 anni fa
gilles27
X 0 X

Non è possibile cancellare una riga della tabella padre senza modificare le relative righe della tabella figli.

no action e restrict dicono a MySQL di non procedere con la cancellazione in caso di presenza di figli legati al padre da cancellare.

L'unico modo per conservare i figli è con "set null"

 :bye:

.. ma allora.. se io cancello il padre e setto  null il figlio..   reinserisco il padre.. non posso più ripristinare il collegamento tra figlio e padre? o è ancora possibile in qualche modo? se sì quale? ??? :-\ ???.. (non riesco a capire l'utilità di SET NULL.. così non si crea garbage collection?)

risposto 10 anni fa
gilles27
X 0 X

con "SET NULL" ottieni figli di nessuno e la cosa può avere senso nelle situazioni in cui i figli possono perdere il padre.

Non si ottiene spazzatura ("garbage" e non "garbage collection" che significa "raccolta della spazzatura") perché il NULL specifica chiaramente che i figli non hanno padre.

Si otterrebbe spazzatura nel caso i figli avessero un padre non presente nella tabella "padri" (quello che stai cercando di ottenere e che fortunatamente non è possibile fare)

Il reinserimento del padre è una operazione che in genere non ha senso in un database. Perché allora è stato cancellato?

Quando si lavora con con le foreign key si inseriscono diversi vincoli sui dati. Se non si vogliono questi vincoli allora non bisogna usare le foreign key. perdendo però in "solidità" e consistenza dei dati.

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

..ok.. io non metterei volentieri queste Foreign Key ma il passaggio da ER-R a Traduzione me lo impone.. o posso anche evitare la referenziazione??

risposto 10 anni fa
gilles27
X 0 X

Se sei partito da un modello entità-relazione significa che vuoi fare le cose per bene, quindi i vincoli non sono tuoi nemici ma tuoi alleati...

Se il modello ER è corretto e la traduzione in modello relazionale è corretta allora non dovresti avere mai la necessità di superare i vincoli imposti :dunno:

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda