|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
SQL Vincolo di integrità referenziale
ho due tabelle dove la prima, t1, possiede un ID definito come chiave primaria.
La seconda tabella, t2, possiede un attributo ID che è chiave esterna verso l'ID di t1. Se ora inizio a popolare la mia base di dati, posso inserire valori nell'ID di t2 sse il medesimo valore è già presente in t1 però: se ad un tratto io decidessi di modificare un valore chiave di t1, vorrei che questo si propagasse alle restanti tabelle quindi, si devono aggiungere cose del tipo ON UPDATE CASCADE etc...... Domanda: ma ON DELETE UPDATE vanno aggiunte solo alla tabella con la chiave esterna ? Spero di essermi fatto capire |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
faccio un esempio che è meglio
![]() t1(ID, DESCRIZIONE) t2(NOME, INDIRIZZO, ID) |
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: Aug 2005
Messaggi: 579
|
Quote:
comunque se mi ricordo bene... sì il cascade va solo quando dichiari ID che referenzia l'altro ID (in t1) allora metti come propagare le modifiche. |
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
ho messo l'ID di t2 in italico per sottolineare che è chiave esterna di t1.
Ho fatto delle prove ed ho notato che di defaut ON UPDATE NO ACTION e similare viene aggiunto alla tabella referente e no a quella referenziata. Il mio dubbio è nato in quanto, se ho una tabella t1 che fa per così dire da guida per la mia base di dati ed altre tabelle che contengono una chiave esterna verso la tabella t1, e ad un certo punto desidero modificare un valore di t1 che è chiave, non mi è consentito; invece volevo capire come sarebbe possibile ciò propagandolo poi anche a tutte le atre tabelle referenti. Ultima modifica di misterx : 16-03-2007 alle 07:29. |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
cmq, ho fatto diverse prove ed ho notato che se specifico n tabelle figlie con ON UPDATE CASCADE, modificando un valore chiave questo si propaga a tutte le figlie però, è sufficiente che una delle tabelle abbia la specifica NO ACTION per bloccare il CASCADE; che voi sappiate, c'è un motivo per tale comportamento bloccante ?
|
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
no il vincolo on update cascade va messo su T1, e nn su t2. è il dbms che si arrangia a fare tutto
|
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
Quote:
Codice:
CREATE TABLE t1 ( id integer PRIMARY KEY, corso character(20) ); CREATE TABLE t2 ( docente character(20), giorni character(20), id integer FOREIGN KEY (id) REFERENCES t1(id) ON UPDATE CASCADE; ); Le clausole ON DELETE e ON UPDATE indicano quale azione deve essere compiuta nel caso in cui una tupla nella tabella referenziata venga eliminata o aggiornata. Ma la tabella referenziata è la tabella padre o figlia ? http://database.html.it/guide/lezion...e-il-database/ Ultima modifica di misterx : 16-03-2007 alle 08:31. |
|
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
ok ho detto una cazzata, scusami... ho appena controllato un vecchio progetto universitario e in effetti il vincolo va messo sul referente... in questo modo, credo, puoi associare a tabelle diverse azioni diverse se lo stesso dato riferito viene modificato...
spiegami un po' meglio la faccenda delle n tabelle con una sola impostata su no action |
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
referenziato = dato originario
referente = foreign key, dato il cui valore è preso da un dato di un'altra tabella |
![]() |
![]() |
![]() |
#10 | |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
Quote:
edit ho provato proprio ora con 3 tabelle ed è sufficiente che una abbia specificato ON UPDATE NO ACTION che viene bloccata la propagazione dell'aggiornamento. Ultima modifica di misterx : 16-03-2007 alle 08:50. |
|
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
vado nel campo delle ipotesi... la clausola no action significa "impedisci la modifica"... di cosa? della chiave riferita!!! quindi viene bloccato tutto l'iter a monte perchè il valore riferito non può essere modificato.
non potresti avere un comportamento del tipo che in una tabella referente non viene aggiornato il dato mentre nelle altre si, perchè romperesti la integrità referenziale |
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
ma non è strano che se su 10 tabelle una sola ha la clausola non action viene bloccato tutto ?
|
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
non è strano... almeno finchè è coerente con la semantica del progetto e gli intenti del progettista... semplicemente stai dicendo che tutte le tabelle tranne una accettano un update, l'ultima no e quindi l'update è vietato, ed è vietato nella tabella riferita. essendo vietato nella tab riferita, è bloccato PER OGNI altra tabella referente... sta al progettista decidere se questa configurazione ha senso o meno, ma a livello logico, cioè per il dbms, questo è l'unico comportamento corretto
|
![]() |
![]() |
![]() |
#14 | |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
Quote:
9 accettano l'update ed 1 no ed è sufficiente quell'unica tabella per evitare l'update su tutte le altre. |
|
![]() |
![]() |
![]() |
#15 |
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
infatti, se tu hai
T1 -> dato originale, tabella riferita T2 -> primo referente (cascade) T3 -> secondo refernte (no action) se modifichi il dato in T1 e potessi aggiornare in T2 e lasciare invece le cose come stanno in T3 perderesti l'integrità referenziale, perchè T3 avrebbe una tupla che potenzialmente riferisce un dato non più esistente (il vecchio valore)... oppure, potresti cambiare in T2 poi passare in T3 e vedereil no action e bloccare tutto, ma il dato aggiornato in T2 che fine fa? di nuovo romperesti l'integrità referenziale |
![]() |
![]() |
![]() |
#16 |
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
|
![]() |
![]() |
![]() |
#17 |
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
è come dire, ci sono 10 persone che devono decidere se approvare una variazione... 9 dicono "per me è lo stesso", 1 dice "no, io non posso accettare" e quindi si decide per il no.
la semantica del cascade nn è "accetta e basta", ma è "se altrove nn ci sono divieti, accetta" |
![]() |
![]() |
![]() |
#18 |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
|
![]() |
![]() |
![]() |
#19 |
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
beh neanche da me era emersa in effetti, ma da quanto abbiamo detto in precedenza penso nn possa che essere così... poi magari è una caratteristica del dbms, nn lo so, ma secondo me il comportamento non può che essere quello (nel caso di un no action)
Ultima modifica di mad_hhatter : 16-03-2007 alle 11:55. |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 05:34.