Le chiavi primarie numeriche dei record eliminati in un database vengono riutilizzate per i nuovi record futuri?

StackOverflow https://stackoverflow.com/questions/253522

Domanda

Ad esempio, se ho un campo numerato automaticamente, aggiungo nuovi record senza specificare questo campo e lascio che il motore DB lo scelga per me.
Quindi, sceglierà il numero del record eliminato? Se sì, quando?

// SQL Server, MySQL. //

Domanda di follow-up: Cosa succede quando il motore DB esaurisce i numeri da utilizzare per le chiavi primarie?

È stato utile?

Soluzione

NO. le chiavi primarie numeriche non verranno riutilizzate, tranne se le specifichi manualmente (dovresti davvero evitarlo!)

Altri suggerimenti

AFAIK, questo potrebbe accadere in MySQL:

Come funziona la gestione AUTO_INCREMENT in InnoDB :

  

InnoDB utilizza il contatore di incremento automatico in memoria per tutto il tempo in cui il server è in esecuzione. Quando il server viene arrestato e riavviato, InnoDB reinizializza il contatore per ogni tabella per il primo INSERT nella tabella, come descritto in precedenza.

Dopo il riavvio del server. Innodb riutilizza i valori auto_increment generati in precedenza. :

  

Correzione suggerita:   la tabella innodb non deve perdere la traccia del numero successivo per la colonna auto_increment dopo   restart.

Dipende dal sistema di numerazione automatica. Se stai utilizzando una sequenza di qualsiasi tipo, il numero di record eliminati non verrà riutilizzato, poiché la sequenza non ne è a conoscenza.

Generalmente no, i numeri non vengono riutilizzati.

Tuttavia, è possibile - in prodotti come Oracle - specificare un generatore di sequenze che scorre ciclicamente e riutilizzerà i numeri.

Che si tratti di un numero di record eliminati o meno è un problema per le tue applicazioni.

Questa domanda deve essere resa più precisa:

... " con Oracle Sequences "

... " con colonne autonumber di MySQL "

... ecc ...

Fintanto che crei correttamente la tabella non riutilizzerai i numeri. Tuttavia puoi RIPRISTINARE la colonna identità (IN MSSQL comunque) usando quanto segue:

: inserisci il numero dell'ultima voce valida nella tabella, non il numero successivo da utilizzare

DBCC CHECKIDENT ([TableName], RESEED, [NumberYouWantToStartAt])

Questo è ovviamente folle ... e non dovrebbe mai essere fatto :)

MySQL non riutilizzerà gli ID a meno che tronchi la tabella o elimini da la tabella senza alcuna clausola where (nel qual caso MySQL, internamente , esegue semplicemente un troncato ).

Non specificamente. Se la chiave viene letta da una sequenza o da una colonna di identità autoincrementante, la sequenza si collegherà e produrrà il valore successivo. Tuttavia, puoi disattivare questo ( imposta identity_insert su su SQL Server) e inserire qualsiasi numero desiderato nella colonna purché non violi il vincolo di unicità.

Sì, dipende davvero dal modo in cui generi l'ID.

Ad esempio se si utilizza un GUID come chiave primaria, la maggior parte delle implementazioni per ottenere un nuovo Guid casuale non è probabile che scelga di nuovo un altro Guid, ma avrà un tempo sufficiente e se il Guid non è nella tabella l'inserto L'istruzione andrà bene, ma se esiste già una guida, si otterrà una violazione del vincolo chiave primaria.

Considero la funzione MySQL "quotata" di riutilizzare l'id è un bug.

Prendi in considerazione qualcosa come l'elaborazione dei caricamenti di file. L'uso dell'ID database come nome file è una buona pratica: semplice, nessun rischio di exploit con nomi file forniti dall'utente, ecc.

Non puoi davvero rendere tutto transazionale quando è coinvolto il filesystem ... dovrai impegnare la transazione del database, quindi scrivere il file o scrivere il file e impegnare la transazione del database, ma se uno o entrambi falliscono, o hai un arresto anomalo, o il tuo filesystem di rete ha un adattamento, potresti avere un record valido nel database e nessun file, o un file senza un record del database, dal momento che la cosa non è atomica.

Se si verifica un problema del genere, e la prima cosa che fa il server quando ritorna è sovrascrivere gli ID, e quindi i file, delle transazioni di rollback, fa schifo. Quei file avrebbero potuto essere utili.

no, immagina se la tua banca ha deciso di riutilizzare il tuo account_id - arghhhh !!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top