2011-06-17 21 views
5

La mia tabella db ha l'aspetto di questa immagine. http://prntscr.com/22z1nProblema con colonna "id" con incremento automatico

Recentemente ho creato la pagina delete.php. funziona correttamente ma quando ho cancellato il 21esimo utente il prossimo utente registrato ottiene il 24esimo id invece di 21.

E 'possibile inserire le informazioni degli utenti appena registrati nella prima riga vuota? (In questa situazione 21 ° riga)

Nel modulo di registrazione, l'utente appena registrato può scrivere i nomi degli utenti esistenti ed essere amici con loro dopo la registrazione. Per questa amicizia ho un'altra tabella che associa l'id dell'utente appena registrato e l'utente esistente.

Per questo scopo sto utilizzando mysql_insert_id durante la registrazione per ottenere l'id per il nuovo utente. Ma dopo l'eliminazione della 21a riga durante il processo di registrazione nex mysql_insert_id mi ha dato il numero 21. ma memorizzato nella 24a riga. E metti la tabella delle associazioni 21 per il nuovo utente. Voglio risolvere questo problema

+0

Si potrebbe fraintendere 'mysql_insert_id()'. Restituisce l'ultimo ID inserito. Chiamandolo ripetutamente verrà sempre restituito l'ultimo, mai il successivo. Il suo valore non cambierà fino a quando un altro inserimento è stato completato. –

risposta

2

Una colonna MySQL auto_increment mantiene un numero internamente e la incrementerà sempre, anche dopo le eliminazioni. Se è necessario compilare uno spazio vuoto, è necessario gestirlo autonomamente in PHP, anziché utilizzare la parola chiave auto_increment nella definizione della tabella.

Rollback per riempire gli ID di riga vuota può causare tutti i tipi di difficoltà se si dispone di relazioni di chiave esterna da mantenere, e in realtà non è consigliabile.

auto_increment può essere reimpostato utilizzando un'istruzione SQL, ma questo non è consigliato perché causerà errori di chiave duplicati.

-- Doing this will cause problems! 
ALTER table AUTO_INCREMENT=12345; 

EDIT far valere i Suoi relazioni di chiave esterna, come descritto nei commenti, si dovrebbe aggiungere alla vostra definizione di tabella:

FOREIGN KEY (friendid) REFERENCES registration_table (id) ON DELETE SET NULL; 

Compilare i nomi di tabella e di colonna corrette. Ora, quando un utente viene cancellato dalla registrazione, la loro associazione di amici viene annullata. Se hai bisogno di riassociarti con un altro utente, questo deve essere gestito con PHP. mysql_insert_id() non è più utile.

Se è necessario trovare l'ID numerato più alto ancora nel database dopo l'eliminazione per associarlo agli amici, utilizzare quanto segue.

SELECT MAX(id) FROM registration_table; 
+0

posso farlo con mysql_insert_id? –

+0

@Tural Teyyuboglu: mysql_insert_id() ottiene l'ID dell'ultimo inserimento. Se si incrementa e memorizza quel valore, è possibile utilizzarlo nuovamente per il prossimo inserimento. Anche se questo non sarebbe necessario, perché conosci già l'id che hai usato durante l'ultimo inserimento. –

+0

@Tural Teyyuboglu No, poiché 'mysql_insert_id' recupererà solo l'ultimo ID utilizzato. –

3

Quando si utilizza una colonna AutoIncrement id, il valore che la voce successiva verrà assegnato non sarà ridotto eliminando una voce. Non è quello per cui viene usata una colonna di autoincremento. Il motore di database incrementerà sempre quel numero su un nuovo inserto e non decrementerà mai quel numero su un'eliminazione.

2

L'incremento automatico è un tasto sequenza tracciato come parte della tabella. Non torna indietro quando si elimina una riga.

+1

per favore aiutami a realizzare la mia idea –

1

Facilmente, no. Quello che puoi fare (ma non suggerisco di farlo) sta facendo una funzione SQL per determinare il numero più basso che non è attualmente occupato. Oppure puoi creare una tabella di ID che sono stati eliminati e ottenere il numero più piccolo da lì. Oppure, e questa è l'idea migliore, ignorare le lacune e rendersi conto che il database va bene.

1

Quello che vuoi fare è possibile aggiungendo una colonna in più alla tua tabella chiamata qualcosa come user_order.È quindi possibile scrivere il codice per gestire gli inserimenti e le eliminazioni in modo che questa colonna sia sempre sequenziale senza spazi vuoti.

In questo modo si evitano i problemi che si potrebbero avere a che fare con una colonna auto_increment.

1

Non è una buona pratica per azzerare il valore auto_increment, ma se si ha realmente bisogno di farlo, in modo da poter:

ALTER TABLE mytable AUTO_INCREMENT = 1; 

eseguire questa query dopo ogni eliminazione. Il valore Auto_increment non sarà impostato su 1, questo imposterà automaticamente il valore più basso possibile.

+1

perché pensi che sia buono per il robot? –

+0

@Tural, immaginiamo di avere table1 e table2. table2 ha una chiave di prua per table1. Supponiamo che tu elimini qualcosa da table1 e poi aggiungi una nuova riga alla stessa tabella. Quindi la nuova riga ottiene lo stesso id della riga eliminata. Ma ora possiamo avere una situazione quando una riga in table2 punta alla nostra nuova riga in table1. In precedenza questa riga indicava la nostra riga eliminata e ora punta a una nuova riga. Quindi, come puoi vedere, va bene. – Karolis

+0

@Tural, scusa, nella mia ultima frase volevo dire che questo NON è OK. Ma penso che tu abbia capito :) – Karolis

Problemi correlati