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

    Dubbio campo AUTO_INCREMENT e riordinamento

    Salve a tutti, oggi, per caso, mi sono trovato davanti ad un dubbio amletico.
    Ho una tabella di questo tipo:
    codice:
    CREATE TABLE `libri` (
      `id_libro` int(11) NOT NULL AUTO_INCREMENT,
      `isbn` varchar(255) NOT NULL,
      `autore` varchar(255) NOT NULL,
      `titolo` varchar(255) NOT NULL,
      `casa_editrice` varchar(255) NOT NULL,
      `anno` varchar(4) NOT NULL,
      `materia` varchar(255) DEFAULT NULL,
      `prezzo` float NOT NULL,
      `venduto` varchar(1) NOT NULL DEFAULT '0',
      `data_vendita` varchar(255) NOT NULL,
      PRIMARY KEY (`id_libro`),
      FULLTEXT KEY `autore` (`autore`,`titolo`)
    );
    e mi sono accorto che cancellando un record, il capo id_libro (che è di tipo AUTO_INCREMENT) logicamente continua ad assegnare id non recuperando quelli perduti dalla cancellazione.
    Se ho i record con id_libro 1,2,3,4,5,6,7,8... e rimuovo il numero 8, al successivo inserimento avrà assegnato il numero 9; idem se rimuovo il numero 4 avrò un buco tra il record 3 ed il record 5.
    Siccome sto utilizzando questo tipo di database per organizzare un mercatino del libro usato in cui la catalogazione dei libri avviene per numero crescente da 1 a n, non è cosa buona avere questi buchi di assegnazione.
    Esiste un modo per riordinare gli id_libro? In modo che quando si presenta un buco come quello tra 3 e 5 dell'esempio di prima, possa scalare in alto tutta la lista andando ad assegnare nuovamente il numero 4 precedentemente cancellato?

    Grazie mille!!

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2005
    Messaggi
    231
    Un campo con AUTO_INCREMENT non può avere il comportamento da te desiderato.
    Personalmente ti consiglio di lasciare il campo id_libro così come è e fargli fare il suo lavoro di chiave univoca primaria e di aggiungere un nuovo campo 'numero_progressivo' (chiamalo come preferisci) in cui fai la gestione che ti serve, però la devi fare tu con alcune tecniche.

    Potresti ad esempio creare una tabella così

    codice:
    CREATE TABLE [NUMBERS](
    	[n] [int] NOT NULL
    )
    te la riempi tramite php con 10 000 000 di righe del tipo
    1
    2
    3
    4
    ...
    ...
    9 999 999
    10 000 000

    e poi per assegnare il codice al nuovo libro che stai inserendo puoi usare una query come la seguente

    codice:
    SELECT N AS PROGRESSIVO 
    FROM NUMBERS
         LEFT JOIN libri ON numero_progressivo = N
                                WHERE numero_progressivo = NULL
                                ORDER BY N LIMIT 0,1
    Controlla il codice mysql con spirito critico perchè sono un po' arruginito e potrei averlo mischiato con SQL SERVER

    Ciao
    Se la risposta ti è stata in qualche modo di aiuto o ti va di supportarmi metti "mi piace" alla pagina a questo link

    https://www.facebook.com/blogprogrammatori

    Non ti costa nulla!!

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