|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: May 2000
Messaggi: 6087
|
[sql] evitare insert di una t-upla già presente
Periodicamente eseguo uno script in php per popolare il mio db.
Poichè spesso accade che una t-upla sia già inserita nel db, come posso evitare che venga inserita nuovamente? E' possibile fare un controllo a livello di db, per non fare un controllo a livello di script in php? Tnx!
__________________
PSN: jNash08 "Iddu pensa sulu a iddu..." (cit.) Più di 100 compravendite sul forum
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jan 2002
Messaggi: 437
|
Intendi dire che non vuoi modificare lo script ma vuoi che il db se ne renda conto e non faccia l'update?
Forse stai parlando di trigger.... ma in realtà non capisco perchè non esegui lo script una volta sola dato che si tratta di popolamento della base di dati! |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9947
|
Quote:
MySQL li implementa? Fino a poco tempo fa solo PostgreSQL, tra i free, li aveva.
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<< Più largo è il sorriso, più affilato è il coltello. |
|
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9947
|
Quote:
Bisognerebbe modifcare lo script in modo che prima faccia una ricerca di quella tupla e se la ricerca ha esito negativo d'inserirla. Magari esiste qualche altra MACROISTRUZIONE del DBMS che la risolve con meno smanettamento: ormai i DBMS danno una serie impensabile di possibilità, statistiche ed AI comprese. CMQ il controllo puramente a livello DB penso sia infattibile in quando il DB si occupa come principio di difendere le regole ACID e basta, quindi se il DB le rispetta lui è a posto. Tra l'altro se ha la stessa chiave il DBMS non la fa inserire già di default. Se invece la chiave è 1 seriale allora il problema esiste.
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<< Più largo è il sorriso, più affilato è il coltello. Ultima modifica di Matrixbob : 22-06-2007 alle 10:31. |
|
|
|
|
|
|
#5 | ||
|
Senior Member
Iscritto dal: May 2000
Messaggi: 6087
|
Quote:
Quote:
__________________
PSN: jNash08 "Iddu pensa sulu a iddu..." (cit.) Più di 100 compravendite sul forum
|
||
|
|
|
|
|
#6 | |||
|
Senior Member
Iscritto dal: May 2000
Messaggi: 6087
|
Quote:
Quote:
Quote:
__________________
PSN: jNash08 "Iddu pensa sulu a iddu..." (cit.) Più di 100 compravendite sul forum
|
|||
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Mar 2006
Città: Bergamo
Messaggi: 2499
|
fai prima una SELECT count(*) FROM pippo WHERE....
con tutte le condizione che secondo te rendono due tuple uguali. se torna > 0, non fai la insert
__________________
ho concluso con: kvegeta, doctordb, Leland Gaunt.
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Jan 2002
Messaggi: 437
|
L'idea del trigger sarebbe questa (in linea teorica, poi mi spiego meglio):
Crei un trigger nel DBMS che PRIMA di ogni inserimento in una specifica tabella (la tua) controlla PER OGNI RIGA che stai inserendo se esiste già una tupla con le caratteristiche di quella nuova ed eventualmente non effettua l'inserimento. In una sintassi da me inventata (nel senso che non è codice funzionante ma ci si avvicina): Codice:
CREATE TRIGGER nome_trigger BEFORE INSERT ON tua_tabella FOR EACH ROW BEGIN IF (SELECT COUNT(*) FROM tua_tabella WHERE NEW.attributo_da_verificare = attributo_da_verificare) > 0 THEN RETURN FALSE; END IF; END; Per MySQL puoi dare un occhio qui: http://dev.mysql.com/doc/refman/5.0/...e-trigger.html Inoltre mi sorge un dubbio. La tabella nella quale vai ad inserire quelle tuple, non dovrebbe avere come chiave gli attributi che vorresti non fossero ripetuti? Mi spiego, la definizione di chiave primaria è proprio quella di essere presente in solo una tupla della tabella. Perchè nella tua non è così? Altra domanda di curiosità: perchè non modificare lo script? Va bene il puro diletto intellettuale, ma quella è davvero la soluzione più rapida! |
|
|
|
|
|
#9 | |||
|
Senior Member
Iscritto dal: May 2000
Messaggi: 6087
|
Quote:
Quote:
Quote:
__________________
PSN: jNash08 "Iddu pensa sulu a iddu..." (cit.) Più di 100 compravendite sul forum
|
|||
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Jan 2002
Messaggi: 437
|
E di fare una chiave multipla non se ne parla?
Del tipo, id autoincrementante ed un altro campo che è quello che non deve ripetersi. |
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9947
|
Penso che non debba modificare il DB, altrimenti l'avrebbe fatto.
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<< Più largo è il sorriso, più affilato è il coltello. |
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: May 2000
Messaggi: 6087
|
Quote:
Su sei campi (per es.) cinque non devono ripetersi, il sesto è la key della tabella.
__________________
PSN: jNash08 "Iddu pensa sulu a iddu..." (cit.) Più di 100 compravendite sul forum
|
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Jan 2002
Messaggi: 437
|
Ah, no, pensavo fosse uno solo...
|
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9947
|
Quote:
Almeno così ho capito. Ma nemmeno a me ste cose piacciono.
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<< Più largo è il sorriso, più affilato è il coltello. |
|
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
In teoria basta anche un indice... Se la chiave è un'altra...basta uno unique index su tutti gli altri campi che non vuoi che possano essere ripetuti. In tal caso ritorna un errore in fase di inserimento...
Non credo che sia una soluzione molto performante, ma sicuramente è una soluzione valida. |
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
perdonami potresti lavorare sul concetto di Key,calato nello specificodei tuoi attributi,in modo da delegare al database l' esclusione di tuple uguali.
|
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: May 2000
Messaggi: 6087
|
Quote:
l'esigenza è quella di evitare (senza interrompere la procedura inviata dallo script php) l'inserimento di t-uple uguali. Servirebbe uno "scavalcamento" e l'inserimento solo delle t-uple diverse anche solo per un campo. Se lo script si interrompe non va bene, non inserirebbe così le t-uple "buone".
__________________
PSN: jNash08 "Iddu pensa sulu a iddu..." (cit.) Più di 100 compravendite sul forum
|
|
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Come ti ho detto basta creare uno unique index su tutti gli attributi escluso l'id...
|
|
|
|
|
|
#19 | |
|
Senior Member
Iscritto dal: Jul 2001
Messaggi: 9947
|
Quote:
CMQ se è 1 cosa fatta ogni tanto è anche accettabile come side effect.
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<< Più largo è il sorriso, più affilato è il coltello. |
|
|
|
|
|
|
#20 | |
|
Senior Member
Iscritto dal: May 2000
Messaggi: 6087
|
Quote:
id nome cognome anni 1 pippo pluto 25 con key id e passassi la t-upla pippo pluto 26 non verrebbe inserita in quanto nome=pippo non sarebbe più unico nel db. O sbaglio? Tnx!
__________________
PSN: jNash08 "Iddu pensa sulu a iddu..." (cit.) Più di 100 compravendite sul forum
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 18:20.










Più di 100 compravendite sul forum


ho concluso con: kvegeta, doctordb, Leland Gaunt.








