|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Oct 2009
Città: Varese
Messaggi: 307
|
[SQL] INSERT or UPDATE
sto sviluppando un modulo per joomla e mi trovo per la prima volta davanti a questo tipo di problema:
è possibile (in SQL) eseguire una query di inserimento se non esiste una certa tupla oppure eseguire un update in caso contrario? mi spiego meglio, io dovrei inserire una tupla che contiene come campi un ID ed una stringa, ora, visto che io non so se questo ID è gia in uso vorrei che se lo fosse la nuova stringa andasse ad aggiornare quella gia esistente. se non dovesse essere possibile non sapreste fornirmi un metodo alternativo? così sui due piedi mi viene in mente di fare un "SELECT id FROM tabella where id=quello_che_mi_interessa" poi tramite php controllo il risultato ed in caso di esito positivo eseguo un UPDATE, altrimenti un INSERT. consigli? |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Firebird è un engine che ti offre un'istruzione che esegue un'insert se il record non esiste, o un update se c'è già. Non so come sono messi gli altri engine SQL.
Eventualmente per quelli a cui manca uno strumento del genere lo si può implementare facilmente con delle stored procedure.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Oct 2009
Città: Varese
Messaggi: 307
|
tutto risolto.
ho utilizzato questa espressione che a dire il vero nemmeno avevo mai sentito nominare, probabilmente è molto poco pubblicizzata: ecco l'intera istruzione: Codice PHP:
sto informando mi giusto adesso su questo firebird, noto che memorizza i dati in un file di testo, questo potrebbe essere interessante. |
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Apr 2008
Città: Varese
Messaggi: 406
|
Quote:
__________________
IT Developer at Hardware Upgrade S.r.l. self.love(this.me()); |
|
|
|
|
|
|
#5 | ||
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
Quote:
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
||
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Jul 2007
Messaggi: 1092
|
Quote:
http://dev.mysql.com/doc/refman/5.0/en/replace.html |
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
L'operazione che chiedi si chiama Upsert (this into that table)
In Oracle e' realizzata con l'istruzione MERGE. Per poter dire che un motore "la applica" occorre che l'istruzione possa agire sui SET, non sul singolo record. UPDATE, DELETE ed INSERT agiscono su set di record, e anche l'istruzione che realizza la upsert dovrebbe farlo per poter essere applicata efficentemente. Es: Codice:
MERGE INTO bonuses b USING ( SELECT employee_id, salary, dept_no FROM employee WHERE dept_no =20) e ON (b.employee_id = e.employee_id) WHEN MATCHED THEN UPDATE SET b.bonus = e.salary * 0.1 DELETE WHERE e.salary<=40000; WHEN NOT MATCHED THEN INSERT (b.employee_id, b.bonus) VALUES (e.employee_id, e.salary * 0.05) WHERE (e.salary > 40000); PS: Oracle e' sempre gratuito e liberamente distribuibile anche per applicazioni commerciali
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. Ultima modifica di gugoXX : 08-11-2009 alle 12:26. |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Oct 2009
Città: Varese
Messaggi: 307
|
se non ho capito ma le il REPLACE cancella la tupla con chiave duplicata e la sostituisce con quella specificata.
questo vuol dire che devo per forza assegnare un valore a tutti i campi altrimenti viene usato il valore di default oppure lasciato vuoto, perdendo così i vecchi dati gia presenti. con la clausola ON DUPLICATE KEY dovrebbero essere mantenute le informazioni gia presenti per quei campi che non vengono nuovamente specificati, giusto? per quanto riguarda le performances credo che REPLACE sia più lenta in quanto effettua 2 queryes alo posto di una sola. non so se ho detto qualcosa di sbagliato, potete confermare smentire qulche cosa? |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 06:34.




















