Visualizzazione dei risultati da 1 a 9 su 9

Discussione: sequence con mysql 5.5

  1. #1

    sequence con mysql 5.5

    ciao ragazzi,
    utilizzo mysql 5.5.14 e avrei bisogno di avere a disposizione una sequence (staccata da qualsiasi tabella) che mi generi dei numeri univoci e da poter invocare quando voglio.

    Sul manuale parla di simulare la sequence creando una tabella con un autoincrement, ma possibile che non ci sia una soluzione come in Oracle?

    Grazie.

  2. #2
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469

    Re: sequence con mysql 5.5

    Originariamente inviato da scrittore80
    ciao ragazzi,
    utilizzo mysql 5.5.14 e avrei bisogno di avere a disposizione una sequence (staccata da qualsiasi tabella) che mi generi dei numeri univoci e da poter invocare quando voglio.

    Sul manuale parla di simulare la sequence creando una tabella con un autoincrement, ma possibile che non ci sia una soluzione come in Oracle?

    Grazie.
    certo che è possibile, perchè la gestione dei campi autoincrementanti è stata introdotta, storicamente, con una vera e propria cella di memoria (è materialmente una variabile), per eliminare il problema di simulare i campi con sequenze (alla postgres per capirci).

    Quindi "esiste" il concetto nativo di campo autoincrementante, mentre non esiste il concetto di "sequenza" (che dovrebbe servire per simulare il primo).

    Materialmente ti basta fare una tabella MEMORY (se vuoi una sequenza monotona crescente); attenzione solo ai lock che sono a livello di tabella, e non di record, anche se la cosa non è generalmente "punitiva" per questi utilizzi

  3. #3
    grazie per la risposta, in pratica mi hai confermato quello che temevo: sono costretto a crearmi una tabella

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    e la cosa ti turba?

  5. #5
    si perchè per me è assurdo doversi creare una tabella (che serve per memorizzare dati) quando io ho bisogno solo di un "contatore". Magari poi lo fa anche oracle, ma non esplicitamente per le meno. E cmq la gestione è diversa, se hai una sequence in stile oralce la invochi e ti restituisce un numero, con mySql forse devi fare anche più operazioni.

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    Originariamente inviato da scrittore80
    si perchè per me è assurdo doversi creare una tabella (che serve per memorizzare dati) quando io ho bisogno solo di un "contatore". Magari poi lo fa anche oracle, ma non esplicitamente per le meno. E cmq la gestione è diversa, se hai una sequence in stile oralce la invochi e ti restituisce un numero, con mySql forse devi fare anche più operazioni.
    Dipende dall'approccio "filosofico".
    Io, ad esempio, non ho mai usato sequenze, perchè non servono a nulla, se non a generare seriali per chiavi primarie autoincrementanti.

    Riguardo a mysql francamente non mi è chiarissimo quale sia il "dramma": c'è l'engine MEMORY che crea una tabella fittizia, in RAM, che non occupa spazio su disco.
    Ci metti dentro un campo autoincrementante e quando vuoi avere il prossimo ci inserisci un record, prendendo con last_inserted_id() il valore della sequenza.
    ---
    In oracle, ad esempio, è un vero e proprio incubo creare una tabella con un autoincrementante; come vedi è questione di scelte progettuali (dell'RDBMS) e di "confidenza" (dell'utilizzatore) di usare le funzioni che ci sono, o non sono.

    Personalmente non uso nè sequenze nè campi autoincrementanti, proprio per semplificare il porting tra db diversi

  7. #7
    ma scusa, se sta solo nella RAM, il numero che mi genera in un dato momento, può essere uguale ad uno che mi genera dopo aver riavviavo il DB, no? Per me questo non è un generatore univoco.

    Io con oracle invocavo qualcosa tipo: MySequence.next() ed era sempre univoco

  8. #8
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    non so cosa vuoi farci col numero della sequenza, e questo mi rende un po' difficile dare suggerimenti creativi.

    in mysql, molto brutalmente, si definisce normalmente un campo come autoincrementante, fine del problema: l'intera gestione va a carico di mysql medesimo.

    ---
    se invece, per qualche motivo, ti è proprio necessario, puoi fare così
    codice:
    CREATE TABLE prova (
      ser int(10) unsigned NOT NULL AUTO_INCREMENT,
      finto int(10) unsigned DEFAULT 0,
      PRIMARY KEY (ser)
    ) ENGINE=MyISAM AUTO_INCREMENT=1;
    poi ti fai una mini stored function
    codice:
    delimiter |
    drop function if exists htmlnextseq;
    create function htmlnextseq() 
        returns int
        reads sql data
    begin
        declare o_risultato int; 
        
        insert into prova(finto) values (0);
        
        select last_insert_id()
            into o_risultato
            from prova;
    
        delete from prova;
        
        return(o_risultato);  
    end;
    |
    delimiter ;
    e così la chiami
    codice:
    select htmlnextseq();

  9. #9
    bella sta soluzione che mi hai dato, mi hai illuminato! grazie

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.