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

    progressione degli id in un database

    Salve a tutti,

    Creo un database avente un campo Id che si autoincrementa.
    Inserendo i dati quindi creo righe aventi come id 1 poi 2 poi 3 .... e così via.
    Se cancello la riga avente per id 2 la prossima che andrò a creare avrà come id l'ultimo incrementato di uno (se sono a 3 il prossimo id sarà 4).

    La domanda è:

    c'è un modo con cui dire a mysql che se manca l'id 2 la riga che inserisco deve avere proprio quell'id che manca?

    grazie a tutti

  2. #2
    Utente di HTML.it
    Registrato dal
    Nov 2007
    residenza
    Florence - Italy
    Messaggi
    60
    io sono un neofita (ho anch'io il solito problema) ma sono quasi sicuro che fra le funzioni ne esista una che conta il numero di record presenti nel database imagino che la tua procedura si basi su MYSQL_INSERT_ID () giusto ?

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2007
    residenza
    Florence - Italy
    Messaggi
    60

    prova con questa

    dbase_numrecords
    (PHP 3, PHP 4, PHP 5)

    dbase_numrecords -- Restituisce il numero di records in un database dBase.
    Descrizione
    int dbase_numrecords ( int dbase_identifier )


    Restituisce il numero di records (righe) nel database specificato. I numeri dei records sono compresi tra 1 e dbase_numrecords($db), mentre i numeri dei campi sono compresi tra 0 e dbase_numfields($db)-1.

  4. #4
    non so se mysql_insert_id va bene quello che dovrei fare io è recuperare il primo id disponibile...

  5. #5
    Che io sappia, non è possibile andare a riutilizzare gli ID dei record cancellati, in quanto peculiarità di molti database.
    Soprattutto se hai impostato l'autoincrement, che viene impostato proprio per evitare che gli indici si possano sovrapporre in qualche modo.
    Se vuoi propri oandare a riempire tutti i record vuoti, credo proprio che tu sia costretto ad esportare tutti i dati, fare un bel TRUNCATE TABLE, quindi andare a reimportare i dati precedentemente backuppati.

    In questo modo, andrai a riempire tutti i record in ordine cronologico senza spazi......... almeno fino al primo DELETE di un record.

    <ALCIO />
    Per cortesia: no PVT Tecnici
    ******* LINKS *******
    SRL
    MetalWave

  6. #6
    non volevo arrivare a questo.... soprattutto perchè ho bisogno di avere sempre id che si ordinano senza intervalli

    pensavo a qualche tipo di controllo nella query di inserimento dei nuovi dati... ma nn sono ancora arrivatoad una soluzione

    ma possibile che un database potente come mysql non abbia qualche funzione di ripristino del progressivo delgli id numerici ???

  7. #7
    Originariamente inviato da Jhonny Monitore
    non volevo arrivare a questo.... soprattutto perchè ho bisogno di avere sempre id che si ordinano senza intervalli
    Motivo?

    Originariamente inviato da Jhonny Monitore
    pensavo a qualche tipo di controllo nella query di inserimento dei nuovi dati... ma nn sono ancora arrivatoad una soluzione
    Possibile, però devi farlo a mano. Con un ciclo for, cominci da 1 e continui a incrementarlo fino a che la SELECT id FROM tabella WHERE id=$cnt restituisce un record vuoto. Una volta trovato, inserisci il nuovo record specificando esplicitamente il campo id. Oltre ad ovvi problemi di performance avresti anche grossi problemi per controllare gli accessi simultanei (che si possono comunque risolvere con i LOCK, ma qui si esula).
    In alternativa, puoi usare metodi più sofisticati tenendo traccia degli id eliminati per riutilizzarli senza dover scorrere l'intero archivio.
    Ancora, puoi usare query un pò più complesse per scovare il primo buco libero:
    codice:
    SELECT id+1 FROM tabella AS padre WHERE (SELECT id FROM tabella WHERE id = padre.id+1) IS NULL LIMIT 1
    In ogni caso la soluzione è ben complessa e (a mio avviso) mai giustificata, anche perché di solito porta a implementazioni parecchio sporche e inefficienti. Un campo in più spesso risolve molto meglio questi problemi.

    ma possibile che un database potente come mysql non abbia qualche funzione di ripristino del progressivo delgli id numerici ???
    Una specie di rinumerazione di tutti i record di una tabella? Per fortuna non ce l'ha, e comunque la soluzione di Alcio fa quello che chiedi (e usando una tabella di supporto sono 3 linee di comando SQL).

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.