Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2009
    Messaggi
    1,085

    MySql .. campo AUTO_INCREMENT da azzerare

    Ciao,
    mi domandavo se un campo AUTO_INCREMENT possa, ad un certo punto, essere azzerato !?
    (sempre che possa essere assegnato ad un campo che non sia l'indice)

    questo per l'esigenza di non gestire manualmente la numerazione delle righe PER OGNI ANNO.

    Grazie mille

  2. #2
    Utente di HTML.it L'avatar di las
    Registrato dal
    Apr 2002
    Messaggi
    1,221
    puoi assegnarlo ad campo qualsiasi a patto che sia un indice, però ce ne può essere solo uno, quindi se metti come AutoIncrement il campo 'pippo' non lo potrei mettere all'id .... e questo ovviamente non è consigliabile!

    Il calcolatore è straordinariamente veloce, accurato e stupido.
    L'uomo è incredibilmente lento, impreciso e creativo.
    L'insieme dei due costituisce una forza incalcolabile.
    (Albert Einstein)

  3. #3
    AFAIK, si può azzerare solo se la tabella è vuota

  4. #4
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Se ho capito la tua esigenza:

    codice:
    create table progressivo (
      anno smallint not null,
      numero int unsigned not null auto_increment,
      primary key (anno,numero)
    ) engine=myisam;
    
    
    insert into progressivo (anno) values (year(curdate()));
    La query inserirà
    2011,1
    2011,2

    ecc.

    Se setti l'anno a 2012 vedrai che la numerazione ripartirà da 1.

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2009
    Messaggi
    1,085
    Originariamente inviato da nicola75ss
    Se ho capito la tua esigenza:

    codice:
    create table progressivo (
      anno smallint not null,
      numero int unsigned not null auto_increment,
      primary key (anno,numero)
    ) engine=myisam;
    
    
    insert into progressivo (anno) values (year(curdate()));
    La query inserirà
    2011,1
    2011,2

    ecc.

    Se setti l'anno a 2012 vedrai che la numerazione ripartirà da 1.

    l'esigenza è corretta, e quello che mi hai indicato è molto iteressante (non ho fatto prove) ..
    però mi sembra di aver capito che non posso utilizzare altri campi con 'auto_increment' .. quindi niente ID ..

  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2009
    Messaggi
    1,085
    se non si possono avere due campi 'auto_increment', qual'è secondo voi il miglior modo per gestire 'manualmente' l'incremento di un campo, evitando che si creino doppioni nell'ipotesi che contemporaneamente più utenti eseguano la stessa operazione ?
    Grazie mille

  7. #7
    Utente di HTML.it L'avatar di las
    Registrato dal
    Apr 2002
    Messaggi
    1,221
    Originariamente inviato da JANUS70
    se non si possono avere due campi 'auto_increment', qual'è secondo voi il miglior modo per gestire 'manualmente' l'incremento di un campo, evitando che si creino doppioni nell'ipotesi che contemporaneamente più utenti eseguano la stessa operazione ?
    Grazie mille
    io ho sempre gestito la cosa tramite script, mettendo comunque nella tabella un indice UNIQUE (anno,numero) per evitare errori, e ovviamente bloccando le tabelle o usando le transizioni (a seconda dell'engine che si ha) per le operazioni eseguite in contemporanea .... non so se sia la soluzione migliore, ma finora non ho mai avuto problemi.
    Il calcolatore è straordinariamente veloce, accurato e stupido.
    L'uomo è incredibilmente lento, impreciso e creativo.
    L'insieme dei due costituisce una forza incalcolabile.
    (Albert Einstein)

  8. #8
    Utente di HTML.it
    Registrato dal
    Oct 2009
    Messaggi
    1,085
    scusate le domande che possono essere 'stupide', ma sono un pivellino in materia ..

    se non ho capito male, per poter bloccare una tabella si deve usare i 'lock', tramite una 'SELECT ...... FOR UPDATE, che mi tiene bloccata la riga selezionata fino all'aggiornamento ..
    solo che io stò inserendo la riga, non la stò aggiornando !
    a meno chè non ci sia un modo per tenere bloccata tutta la tabella ?


    per quanti riguarda le 'transazioni' .. se non sbaglio consistono nel bloccare il consolidamento degli aggiornamenti finchè non si dà la 'commit' ..
    ma non vedo come questo possa impedire che altri operatori non nel frattempo abbiano inserito una nuova riga con il mio stesso valore.

    grazie

  9. #9
    Utente di HTML.it L'avatar di las
    Registrato dal
    Apr 2002
    Messaggi
    1,221
    Originariamente inviato da JANUS70
    se non ho capito male, per poter bloccare una tabella si deve usare i 'lock', tramite una 'SELECT ...... FOR UPDATE, che mi tiene bloccata la riga selezionata fino all'aggiornamento ..
    solo che io stò inserendo la riga, non la stò aggiornando !
    a meno chè non ci sia un modo per tenere bloccata tutta la tabella ?

    per quanti riguarda le 'transazioni' .. se non sbaglio consistono nel bloccare il consolidamento degli aggiornamenti finchè non si dà la 'commit' ..
    ma non vedo come questo possa impedire che altri operatori non nel frattempo abbiano inserito una nuova riga con il mio stesso valore.

    grazie
    mi sa che hai fatto un po di confuzione tra blocco delle tabelle e le transazioni vere e proprie, per quanto riguarda il blocco delle tabelle, si bloccano appunto le tabelle, non i record quindi la procedura è più o meno questa:

    Blocchi una o più tabelle (LOCK TABLES tabella1,tabella2,ecc.. READ)
    leggi i dati che ti interessano
    fai gli aggionamenti
    sblocchi la tabella (UNLOCK TABLES)

    se altre connessioni cercano di leggere la/le tabella/e bloccate dovranno attendere che tu le abbia sbloccate.

    mentre per le transazioni la cosa è un po più articolata e avrai qualcosa di questo tipo:

    avvii la transazione (START TRANSACTION)
    leggi i dati che ti occorrono avendo cura di mettere la clausola FOR UPDATE nella select
    aggiorni la tabella
    chiudi la transazione (con il COMMIT per confermare o ROLLBACK per annullare)

    in questo caso se altre connessioni cercano di leggere gli stessi dati avranno via libera per una select 'normale', ma non per una select con la clausola 'FOR UPDATE' per la quale dovranno aspettare la chiusura della tua transazione.

    Il calcolatore è straordinariamente veloce, accurato e stupido.
    L'uomo è incredibilmente lento, impreciso e creativo.
    L'insieme dei due costituisce una forza incalcolabile.
    (Albert Einstein)

  10. #10
    Utente di HTML.it
    Registrato dal
    Oct 2009
    Messaggi
    1,085
    penso di aver capito:

    - lock: ti permettono di bloccare la tabella in lettura o in scrittura

    LOCK TABLES tabella1,tabella2,ecc.. READ
    LOCK TABLES tabella1,tabella2,ecc.. WRITE

    nel mio caso, visto che devo fare un'INSERT, è meglio usare l'opzione WRITE

    - transazione: conferma gli aggiornamenti in un punto ben preciso del programma
    - SELECT ... FOR UPDATE: tiene bloccate le righe selezionate per l'aggiornamento

    nel mio caso, visto che devo fare un'INSERT, mi sa che devo usare i LOCK

    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.