PDA

View Full Version : [SQL] domandina circa query di delete


D4rkAng3l
16-01-2008, 10:07
Se ho 3 tabelle così fatte:

IMPIEGATO(IDimpiegato, nome, mansione, IDdipartimento)

COMPETENZE_IMPIEGATO(IDimpiegato, competenze)

DIPARTIMENTO(IDdipartimento, nome)

dove i campi in grassetto sono il campo identificatore della tabella.

Ho questa query che deve eliminare tutti gli impiegati che lavorano nel dipartimento avente nome "Finanza" e cancellare tutte le righe delle loro competenze.
In pratica devo eliminare delle righe dalle tabelle IMPIEGATO e COMPETENZE_IMPIEGATO.

La query che ho trovato sul libro è:


delete IMPIEGATO, COMPETENZE_IMPIEGATO
from IMPIEGATO, COMPETENZE_IMPIEGATO, DIPARTIMENTO

where IMPIEGATO.IDimpiegato = COMPETENZE_IMPIEGATO.IDimpiegato
and IMPIEGATO.IDdipartimento = DIPARTIMENTO.IDdipartimento
and dipartimento.nome = 'Finanza';


Mi sfugge qualcosa su come funziona questo mostro...

allora io elimino solo dalle tabelle che seguono listruzione delete quindi cancello righe solo da IMPIEGATO e COMPETENZE_IMPIEGATO.
Le tabelle elencate dopo l'istruzione from vengono invece usate solo per cercare dati e quindi effettuare i join (a meno che non siano anche successori di deete).

Ora non miè chiaro cosa faccio con i where...è come se gli dicessi: elimina dalle tabelle IMPIEGATO e COMPETENZE_IMPIEGATO dove:
IMPIEGATO.IDimpiegato = COMPETENZE_IMPIEGATO.IDimpiegato questo perchè devo eliminare uno stesso utente con uno stesso id da entrambe le tabelle? non capisco mi sfugge...helpme...

Grazie
Andrea

isAlreadyInUse
16-01-2008, 10:12
Ti conviene fare una foreing key on delete cascade in modo che eliminato l'impiegato si tira dietro pure le competenze

D4rkAng3l
16-01-2008, 10:13
Ti conviene fare una foreing key on delete cascade in modo che eliminato l'impiegato si tira dietro pure le competenze

cioè di dirgli di pescarsinla chiave IDimpiegato da altre tabelle e di eliminare tutte le occoreenze da esse quando elimino da IMPIEGATI? cmq era un esempio per capire come funzionano i join più che un'esigenza pratica...

isAlreadyInUse
16-01-2008, 10:23
Questo è un esempio di quello che ti dicevo

DROP TABLE IF EXISTS UNO;
CREATE TABLE UNO (
ID_TESTA INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY (ID_TESTA)
);

DROP TABLE IF EXISTS DUE;
CREATE TABLE DUE (
ID_RIGA INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
ID_TESTA INT(10) UNSIGNED NOT NULL,
PRIMARY KEY (ID_RIGA),
KEY FK_DUE_1 (ID_TESTA),
CONSTRAINT FK_DUE_1 FOREIGN KEY (ID_TESTA) REFERENCES UNO (ID_TESTA) ON DELETE CASCADE ON UPDATE CASCADE
);


Impostando cosi le tabelle, se elimini un record dalla tabella uno si tira dietro tutte le righe correlate dalla tabella due

isAlreadyInUse
16-01-2008, 10:56
Con le stesse tabelle senza la CASCADE ON DELETE facendo cosi :

DELETE UNO,DUE FROM UNO,DUE WHERE UNO.ID_TESTA=DUE.ID_TESTA
Elimina i dati dalle due tabelle con la stassa id_testa.

P.S. Le prove sono fatte su MySQL

D4rkAng3l
16-01-2008, 11:04
ti ringrazio...si poi anche la cascade on delete et simili me le devo vedere per benino...

isAlreadyInUse
16-01-2008, 11:06
Ti potrà servire:)
http://www.dis.uniroma1.it/~catarci/Cap2_SQL.pdf

D4rkAng3l
16-01-2008, 11:44
ti ringrazio...darò senz'altro una studiata anche a questo :-)