Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [MySql] come vengono gestite queste richieste?

    buongiorno a tutti,
    premetto che non so se la modalità che scrivo in seguito sia giusta o meno (magari ne esiste una che mi evita questi problemi) e comunque:

    ho 2 tabelle:
    - registro (idRegistro,registroNumero,registroAnno, ecc...);
    - registroProgressivo (id,anno,progressivo);

    tramite uno script php, devo aggiungere dei record alla tabella registro e:

    - se l'anno corrente è uguale a registroProgressivo.anno, inserisco nella tabella registro il progressivo appena letto e l'anno corrente. Prima di questo inserimento però, faccio l'UPDATE del progressivo della tabella registroProgressivo;

    - se l'anno corrente è maggiore di registroProgressivo.anno, inserisco nella tabella registro il progressivo 1 e l'anno corrente. Prima di questo inserimento però, faccio l'UPDATE della tabella registroProgressivo settando 2 come progressivo e l'anno uguale al nuovo anno;

    da qui la mia domanda:

    utilizzo questo applicativo in locale con un massimo di una decina di utenti che fanno operazioni di inserimento.

    C'è qualche possibilità che venga letto il valore nella tabella "registroProgressivo" nello stesso momento e che quindi venga inserito lo stesso numero di registro?

    ci sono possibilità di contemporaneità o MySql gestisce queste chiamate in istanti diversi e quindi non avrò problemi di doppioni?

    c'è un'alternativa più funzionale a questa che ho pensato, in modo da poter evitare questo tipo di problemi?

    Grazie a tutti per l'aiuto!
    aquatimer2000

  2. #2
    cerca semplicemente il MAX() di progressivo per l'anno corrente (nella WHERE), considerando che può riportare zero o NULL; poi aggiungi 1


  3. #3
    Quote Originariamente inviata da optime Visualizza il messaggio
    cerca semplicemente il MAX() di progressivo per l'anno corrente (nella WHERE), considerando che può riportare zero o NULL; poi aggiungi 1



    immaginavo ci fosse un'altra soluzione..
    quindi la ricerca per ricavare il nuovo progressivo la faccio direttamente sulla tabella "registro"

    altra domanda:

    questa soluzione è conveniente anche se nella tabella "registro" ho 40 anni diversi ed un totale di circa 50mila record?
    aquatimer2000

  4. #4
    ho fatto 2 test da phpMyAdmin:

    la query "SELECT MAX(registroNumero) FROM registro WHERE anno='2019'" ci impiega 0.0172 secondi

    per ricavare il progressivo dalla tabella registroProgressivi ci mette 0.0011 secondi

    può influire questo dato sulla procedura da scegliere?
    aquatimer2000

  5. #5
    Com’è la query su registroprogressivi?

  6. #6
    Quote Originariamente inviata da optime Visualizza il messaggio
    Com’è la query su registroprogressivi?
    dato su registroprogressivo ho una sola riga: " SELECT * FROM registroprogressivo WHERE id='1' "

    questo di seguito è il codice php (non lo scrivo tutto..) che con cui faccio il tutto.

    Codice PHP:
    <?php

    $annoCorrente 
    //funzione che mi ricava l'anno corrente

    //leggo l'anno dalla tabella "registroprogressivo" , in quanto l'anno, determinerà poi, che numero di registro devo assumere.
    $sql "SELECT * FROM registroprogressivo WHERE id='1'";
    //eseguo la query .. cono PDO.. 

    if ( $row[anno]  == '$annoCorrente' ) {

        
    $registroNumero $row[progressivo];

        
    //aggiorno il progressivo
        
    $progressivo $row[progressivo]++;
        
    $sql "UPDATE registroprogressivo SET progressivo='$progressivo' WHERE id='1'";

    }
    else {

        
    //se mi trovo qui, significa che è cambiato l'anno quindi ..
        
    $registroNumero 1;

        
    //aggiorno il progressivo e l'anno
        
    $sql "UPDATE registroprogressivo SET progressivo='2', anno='$annoCorrente' WHERE id='1'";

    }

    //inserisco i dati nella tabella registro
    $sql "INSERT INTO registro (registroNumero,RegistroAnno,altriCampi...) values('$registroNumero','$annoCorrente','....'....)";

    ?>
    aquatimer2000

  7. #7
    rimane il fatto che parliamo di differenze di centesimi di secondo?
    la tua soluzione rimane sicuramente migliore

    questa differenza di tempi di esecuzione (i campi registroNumero e registroAnno nella tabella "registro" sono indicizzati) , sono così fondamentali?

    oppure, la mia soluzione è sbagliata da non poterla utilizzare?

    resta fermo il fatto che l'obiettivo che voglio raggiungere è non avere doppioni numero/anno nella tabella "registro"
    aquatimer2000

  8. #8
    non si era capito che in registroprogressivo c'era un solo record... comunque, ok la tua, magari per essere sicuri bloccherei la tabella e cercherei di fare tutto dentro lo statement sql -- ma non conosco così bene MySql per aiutarti in questo

  9. #9
    Quote Originariamente inviata da optime Visualizza il messaggio
    non si era capito che in registroprogressivo c'era un solo record... comunque, ok la tua, magari per essere sicuri bloccherei la tabella e cercherei di fare tutto dentro lo statement sql -- ma non conosco così bene MySql per aiutarti in questo
    ok bene !! grazie mille per l'aiuto (come sempre)!
    aquatimer2000

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 © 2019 vBulletin Solutions, Inc. All rights reserved.