DB2 Generazione automatica di colonne / GENERATI SEMPRE pro e contro sulla sequenza

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

  •  06-07-2019
  •  | 
  •  

Domanda

In precedenza utilizzavamo " SEMPRE GENERATI 'per generare i valori per una chiave primaria. Ma ora si suggerisce di utilizzare, invece di "SEMPRE GENERATI", la sequenza per popolare il valore della chiave primaria. Quale pensi possa essere la ragione di questo cambiamento? È solo una questione di scelta?

Codice precedente:

CREATE TABLE SCH.TAB1
 (TAB_P         INTEGER         NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1, NO CACHE),
.
.
);

Ora è

CREATE TABLE SCH.TAB1
 (TAB_P         INTEGER ),
.
.
);

ora durante l'inserimento, genera il valore per TAB_P tramite sequenza.

È stato utile?

Soluzione

Tendo a usare le colonne di identità più delle sequenze, ma le confronterò per te.

Le sequenze possono generare numeri per qualsiasi scopo, mentre una colonna identità è strettamente collegata a una colonna in una tabella.

Poiché una sequenza è un oggetto indipendente, può generare numeri per più tabelle (o qualsiasi altra cosa) e non viene influenzata quando viene eliminata una tabella. Quando viene eliminata una tabella con una colonna di identità, non viene memorizzata la memoria dell'ultimo valore assegnato da quella colonna di identità.

Una tabella può avere una sola colonna di identità, quindi se si desidera registrare più numeri sequenziali in colonne diverse nella stessa tabella, gli oggetti sequenza possono gestirla.

Il requisito più comune per un generatore di numeri sequenziale in un database è di assegnare una chiave tecnica a una riga, che è gestita bene da una colonna di identità. Per esigenze di generazione di numeri più complicate, un oggetto sequenza offre maggiore flessibilità.

Altri suggerimenti

Questo potrebbe probabilmente essere per gestire gli ID nel caso in cui ci siano molte eliminazioni sul tavolo.

Ad esempio: in caso di identità, se i tuoi ID sono 1 2 3

Ora se elimini il record 3, la tua tabella avrà 1 2

E quindi se inserisci un nuovo record, gli ID saranno 1 2 4

Al contrario, se non si utilizza una colonna di identità e si sta generando l'id utilizzando il codice, quindi dopo l'eliminazione per il nuovo inserto è possibile calcolare l'id come max (id) + 1, quindi gli id ??saranno in ordine 1 2 3

Non riesco a pensare a nessun altro motivo, perché una colonna di identità non dovrebbe essere utilizzata.

Ecco qualcosa che ho trovato sul sito publib:

Confronto tra colonne e sequenze IDENTITY

Mentre ci sono somiglianze tra colonne e sequenze IDENTITY, ci sono anche differenze. Le caratteristiche di ciascuno possono essere utilizzate durante la progettazione del database e delle applicazioni.

Una colonna identità ha le seguenti caratteristiche:

  • Una colonna identità può essere definita come parte di una tabella solo quando la tabella è creato. Una volta creata una tabella, non puoi modificarlo per aggiungere un colonna identità. (Tuttavia, esistente caratteristiche della colonna identità potrebbero essere modificato.)
  • Una colonna di identità genera automaticamente valori per a tavolo unico.
  • Quando un'identità la colonna è definita come GENERATA SEMPRE, i valori utilizzati sono sempre generato dal gestore del database. Le domande non sono consentite fornire i propri valori durante il modifica dei contenuti del tavolo.

Un oggetto sequenza ha le seguenti caratteristiche:

  • Un oggetto sequenza è un database oggetto che non è legato a nessuno tavolo.
  • Viene generato un oggetto sequenza valori sequenziali che possono essere utilizzati in qualsiasi istruzione SQL o XQuery.
  • Poiché è possibile utilizzare un oggetto sequenza da qualsiasi applicazione, ce ne sono due espressioni usate per controllare il recupero del valore successivo in sequenza specificata e il valore generato prima dell'istruzione in esecuzione. Il valore precedente espressione restituisce l'ultima valore generato per il specificato sequenza per un'istruzione precedente all'interno della sessione corrente. Il prossimo L'espressione VALUE restituisce la successiva valore per la sequenza specificata. Il l'uso di queste espressioni consente di stesso valore da utilizzare tra più Istruzioni SQL e XQuery all'interno diversi tavoli.

Anche se queste non sono tutte le caratteristiche di questi due elementi, queste caratteristiche ti aiuteranno a determinare quale utilizzare in base alla progettazione del database e alle applicazioni che utilizzano il database.

Non so perché qualcuno dovrebbe MAI usare una colonna di identità piuttosto che una sequenza. Le sequenze realizzano la stessa cosa e sono molto più semplici. Le colonne di identità sono molto più problematiche soprattutto quando si desidera eseguire scaricamenti e carichi di dati in altri ambienti. Non entrerò in tutte le differenze poiché tali informazioni sono reperibili nei manuali, ma posso dirti che i DBA devono essere quasi sempre coinvolti ogni volta che un utente desidera migrare i dati da un ambiente all'altro quando una tabella con un'identità è coinvolto perché può creare confusione per gli utenti. Non abbiamo problemi quando viene utilizzata una sequenza. Consentiamo agli utenti di aggiornare qualsiasi oggetto dello schema in modo che possano modificare le loro sequenze se necessario.

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