Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1

    [Mysql] id i un record appena inserito (senza php)

    Sto finendo un progettino per l'università. Mi manca solo da creare una query per un'operazione che richiede di scrivere su più tabelle ed effettuare degli update... non credo sia possibile fare nulla del genere in una sola query quindi spero che la prof non abbia da ridire se le faccio un paio di insert (complesse.. con select al lroo interno etc etc) e un paio di update...

    Ma non è questo il punto..

    il punto è che dovrei inserire un dato nella tabella "pacchetto" e conoscere l'id appena inserito per inserirlo in un'associazione costituita da un'altra tabella.
    L'unico elemento unique di "paccheto" è l'id stesso, per cui non posso ottenere l'id con un select annidata dentro il secondo insert... a meno di non ottenrlo con una cosa tipo "SELECT max(id) FROM pacchetto"... ma dovrebbe essere un po' troppo arbitraria credo, no?
    Nel senso che nessuno mi garantisce che tra il mio primo ed il mio secondo inser, qualcun'altro non inserisca un altro pacchetto nella base di dati.. per cui al momento della select non mi troverei il pacchetto da me inserito, ma un altro...

    Esiste un modo di inserire con una sola query dati dentro due tabelle (in modo da rendere n qualche modo atomica la quesry sopra esposta).. o qualche altro sistema che mi possa servire?



  2. #2
    Utente di HTML.it L'avatar di Gabbro
    Registrato dal
    Nov 2000
    Messaggi
    828

    Re: [Mysql] id i un record appena inserito (senza php)

    Originariamente inviato da }gu|do[z]{®©

    Nel senso che nessuno mi garantisce che tra il mio primo ed il mio secondo inser, qualcun'altro non inserisca un altro pacchetto nella base di dati.. per cui al momento della select non mi troverei il pacchetto da me inserito, ma un altro...
    ciao guido, e se fai il lock della tabella e poi la "slokki"?

  3. #3

    Re: Re: [Mysql] id i un record appena inserito (senza php)

    Originariamente inviato da Gabbro
    ciao guido, e se fai il lock della tabella e poi la "slokki"?
    oddio..

    non so se sia ortodosso.. nè so come fare.. il lockin dovrebbe essere un meccanismo "interno" di mysql.. non sapevo si potesse utilizzare esplicitamente... indago.. però non so quanto possa piacere alla prof...


    però in teoria non le dovrebbe neanche piacere che usiao più query per un'operazione, senza usare meccanismi di rollback (che non abbiamo studiato in questo esame )

  4. #4
    Utente di HTML.it L'avatar di kuarl
    Registrato dal
    Oct 2001
    Messaggi
    1,093
    c'è la funzione di mysql LAST_INSERT_ID(), questa però funziona solo all'interno di una transazione (implicita o esplicita).

    Non so' se sai come sono strutturate le variabili d'ambiente di mysql, in ogni caso mi sembra di capire che per le tue richieste dovrebbe andare bene.

    Attento che ritorna 0 se non ci sono inserimenti andati a buon fine nella transazione (sessione) corrente

  5. #5
    il problema è che dovrei usare le trasnazioni che ci soo state introdotte solo in linea teorica ma non dovrebbero far parte del programma... vabbè.. al limite faccio così... apprezzerà se mi documento oltre ciò che ci è stato spiegato.. aleno spero

  6. #6
    Utente di HTML.it L'avatar di kuarl
    Registrato dal
    Oct 2001
    Messaggi
    1,093
    Originariamente inviato da }gu|do[z]{®©
    il problema è che dovrei usare le trasnazioni che ci soo state introdotte solo in linea teorica ma non dovrebbero far parte del programma... vabbè.. al limite faccio così... apprezzerà se mi documento oltre ciò che ci è stato spiegato.. aleno spero
    non le trattare, non hai bisogno di usare le innodb...

    a livello teorico una transazione la si fa anche con le myisam, considerando il begin appena stabilisci la connessione e il commit ogni volta che modifichi lo stato di una tabella. A questo mi riferivo quando parlavo di transazioni. Le innodb da questo punto di vista forniscono maggiore flessibilità.

    Come avrai intuito il last_id è una variabile locale, cioè relativa solo ad un unica sessione (o connessione, o transazione), questo ovviamente per evitare collisioni o problemi di sicurezza con le altre connessioni attive sul database.

    In altre parole te usala come se fosse una comunissima funzione e fottitene di tutto il resto

  7. #7
    se è per quesot le tabelle sono già innodb

    ok lo uso così e buonanotte


  8. #8
    Originariamente inviato da }gu|do[z]{®©
    se è per quesot le tabelle sono già innodb

    ok lo uso così e buonanotte

    A prescindere dalla tabella.... esempio
    codice:
    INSERT INTO tabella1
    (id, nome, cognome)
    VALUES 
    (NULL , 'pippo', 'baudo' );
    
    INSERT INTO tabella2
    (id, regione, stato)
    values
    (last_insert_id(), 'Sicilia', 'Italia');
    devi solo farlo con la stessa connessione. Es: con phpmyadmin devono essere nella stessa finestra di query, perche' phpmyadmin rilascia sempre la connessione ad ogni query effettuata perdendo cosi' il valore id inserito in precedenza....


    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  9. #9
    il problema è che il progetto è di basi di dati.. lei vuole l'SQL e via.. e non ci aveva manco dato MySQL come DBMS... ci ha lasciato libera scelta suggerendo però postgree.. io gliela butto così dicendo che tutte quelle query vanno inserite in una transazione... e buonanotte

  10. #10
    Originariamente inviato da }gu|do[z]{®©
    il problema è che il progetto è di basi di dati.. lei vuole l'SQL e via.. e non ci aveva manco dato MySQL come DBMS... ci ha lasciato libera scelta suggerendo però postgree.. io gliela butto così dicendo che tutte quelle query vanno inserite in una transazione... e buonanotte
    come ti pare... ma ....

    Le transizioni servono anche a garantire una integrita' referenziale, ma vanno gestite.

    In altre parole devi poi stabilire se eseguire il COMMIT oppure il ROLLBACK a seconda dell'esito altrimenti non hanno senso alcuno. Come ti ha detto Kuarl, anche le myisam eseguono le transizioni, ma in modo automatico. Cioe' come se eseguissero:

    BEGIN -> QUERY -> COMMIT.

    Quindi affermare di usare le transizioni a questo modo per garantirti l'integrita' del dato e' una strunziball alla Calderoli....

    La prof e' tua... gestiscila tu.



    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.