2015-08-03 13 views
5

Sto utilizzando la funzione IDENTITY di oracle 12 c per incrementare l'ID del record di una tabella.
Come parte della configurazione iniziale, dobbiamo migrare alcuni record da un altro sistema a questa tabella. questi record non sono record sequenziali (i record parziali sono cancellati).Come reimpostare la colonna IDENTITY in oracle su un nuovo valore

Come creare l'identità per creare sempre il massimo value + 1 in base ai record della tabella.

Dopo aver cercato su google le diverse opzioni trovate la parola chiave dell'opzione di valore RESTART WITH. Per questo abbiamo bisogno di creare una nuova procedura negozio e modificare tutte le tabelle con i valori più alti possibili per riavviare con.

Esiste una parola chiave diretta che può essere utilizzata insieme a IDENTITY che può forzarla a rigenerare sempre valori più alti. ?

+0

RESTART CON la funzione non funziona anche se è raccomandata come opzione nei documenti Oracle. Solo l'opzione sembra modificare la tabella e forzare l'IDENTITY a partire dal valore più alto + 1. – sims

+0

"restart with" non è oracle, forse mysql? – Scott

risposta

1

Nessuna parola chiave diretta e devi modificare la tabella (le parole giuste sono INIZIA CON).
C'è un altro modo per modificare una colonna alta per la colonna Identity. Come per le sequenze comuni (l'identità è costruita su una sequenza di sistema) usa un vecchio trucco con INCREMENT BY per spostare il segno in qualsiasi direzione.

ALTER TABLE T 
MODIFY (ID NUMBER GENERATED ALWAYS AS IDENTITY 
INCREMENT BY 50 
NOCACHE); 

Cioè, se per ora il prossimo valore è 100 ed è necessario renderla 1000, è fare questo trucco due volte: "incremento da 900", aggiunge registrare e ritorno "incremento da 1" (se l'identità con passaggio 1).

3

Questo è diventato super facile 12c

alter table your_table modify (id generated by default on null as identity 
           start with limit value); 

Poi la prossima inserto in modo sicuro inserire utilizzando una sequenza che è stata automaticamente ripristinare ciò che è essenzialmente max (id) +1 https://docs.oracle.com/database/121/SQLRF/statements_3001.htm#SQLRF01001

+0

Ricevo sempre _ORA-30673: la colonna da modificare non è una colonna di identità quando si tenta di trasformare una colonna di identità in una colonna. Sembra che tu possa solo modificare le impostazioni di una colonna di identità esistente, non convertire una colonna non identitaria esistente in una. –

+0

corretto. Questa istruzione viene utilizzata per ripristinare il valore della sequenza, non per migrare il comportamento della colonna. Vedi questo per un esempio http://www.grassroots-oracle.com/2016/10/decommissioning-triggers-in-12c.html – Scott

Problemi correlati