Cosa succede quando il motore DB esaurisce i numeri da utilizzare per le chiavi primarie?

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

  •  05-07-2019
  •  | 
  •  

Domanda

Since I DB non riutilizzano il numero di record eliminati è possibile rimanere senza numeri, soprattutto se si sceglie un tipo intero non grande per questa colonna.
Cosa succederebbe e come prevenirlo se è male?

// SQL Server, MySQL //

È stato utile?

Soluzione

Penso che esattamente cosa accadrà dipenderà dal motore di database che stai utilizzando (potrebbero esserci anche differenze tra INNODB e MyISAM in MySQL). Qualunque cosa accada, non sarà carino.

Dovresti semplicemente cambiare il tipo di colonna con un numero intero più grande.

Altri suggerimenti

Si finisce con un tempo di inattività di 3+ ??ore, come Slashdot fatto sulla loro funzione commenti.

Per MySQL, è documentato che :

  

Il comportamento del meccanismo di incremento automatico non è definito se un utente assegna un valore negativo alla colonna o se il valore diventa maggiore dell'intero massimo che può essere memorizzato nel tipo di intero specificato.

La maggior parte dei sistemi di database ha un tipo di dati numerico che può essere più largo di 32 bit. Se si prevedono più di 2 ^ 32 record, è necessario utilizzare una larghezza chiave appropriata.

Sì, è possibile: se consenti solo numeri a 2 cifre, puoi avere solo ID fino a 99 e così via. Gli inserimenti fallirebbero una volta raggiunto il limite. È una questione di buon senso scegliere una dimensione appropriata.

In Postgres, il "seriale" type equivale alla creazione di una SEQUENZA con l'opzione NO CICLO e l'impostazione del campo predefinito su nextval. L'esaurimento di tale sequenza produce un errore:

http://www.postgresql.org/docs/8.3 /interactive/sql-createsequence.html

Dipende dal tuo database, credo in MS SqlServer, semplicemente non puoi inserire nuove righe finché non risolvi il problema. L'ultima volta che l'ho riscontrato, abbiamo risolto il problema riportando la colonna Identity su 1. Ovviamente non è una soluzione universale, ma andava bene con la nostra situazione.

Oracle non supporta colonne ID con incremento automatico e la pratica standard consiste nell'utilizzare un generatore di sequenze. Una sequenza genera numeri interi fino a 28 cifre, quindi se li esaurisci, allora ... Immagino che tu abbia una tabella abbastanza grande. Ma il comportamento dipenderebbe quindi dalla configurazione del generatore di sequenza - un errore o tornerebbe al valore iniziale e si otterrebbe una violazione del vincolo PK al successivo inserimento.

L'ho provato in SQL 2000 qualche tempo fa. Dopo Integer.MaxValue il prossimo valore di identità è Integer.MinValue. Quindi continua a contare come ti aspetteresti. Finché i record che esistevano a 1,2,3 ecc. Sono passati prima che arrivi lì non accadrà nulla di brutto. Se viene eseguito in un duplicato (e il campo è la chiave primaria), l'inserimento non riesce con una violazione della chiave. Non ho provato una colonna di identità che non è vincolata a valori univoci. Immagino che sarebbe contento dei duplicati.

Generalmente riceverai un errore. Usa un BIGINT se sei paranoico.

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